單條SQL語句實現複雜邏輯的幾個例子(1)
一、 按指定規則生成指定商品2002年銷售額,其中彩電項值為2001年的銷售額加2000年的銷售額,微波爐為2000年銷售額, 然後彙總彩電+微波爐的2002年總銷售額。
表資料如下:
CITY PRODUCT YEAR SALES
------ -------------- -------- ---------
北京 彩電 1999 3000
北京 彩電 2000 2500
北京 彩電 2001 4500
北京 微波爐 1999 800
北京 微波爐 2000 7000
北京 微波爐 2001 333
北京 冰箱 1999 2323
北京 冰箱 2000 1212
北京 冰箱 2001 7676
天津 彩電 1999 212121
天津 彩電 2000 434343
天津 彩電 2001 564566
天津 微波爐 1999 23432
天津 微波爐 2000 232
天津 微波爐 2001 34234
天津 冰箱 1999 324324
天津 冰箱 2000 8987686
天津 冰箱 2001 768678
要求用SQL實現如下效果:
CITY PRODUCT YEAR SALES
------ -------------- -------- ---------
天津 微波爐 1999 23432
天津 微波爐 2000 232
天津 微波爐 2001 34234
天津 微波爐 2002 232
天津 冰箱 1999 324324
天津 冰箱 2000 8987686
天津 冰箱 2001 768678
天津 彩電 1999 212121
天津 彩電 2000 434343
天津 彩電 2001 564566
天津 彩電 2002 998909
天津 彩電+微波爐 2002 999141
北京 微波爐 1999 800
北京 微波爐 2000 7000
北京 微波爐 2001 333
北京 微波爐 2002 7000
北京 冰箱 1999 2323
北京 冰箱 2000 1212
北京 冰箱 2001 7676
北京 彩電 1999 3000
北京 彩電 2000 2500
北京 彩電 2001 4500
北京 彩電 2002 7000
北京 彩電+微波爐 2002 14000
建表語句如下:
create table tmp1(CITY varchar2(20), PRODUCT varchar2(20), YEAR number, SALES number);
insert into tmp1 values ('北京','彩電', 1999, 3000);
insert into tmp1 values ('北京','彩電', 2000, 2500);
insert into tmp1 values ('北京','彩電', 2001, 4500);
insert into tmp1 values ('北京','微波爐', 1999, 800);
insert into tmp1 values ('北京','微波爐', 2000, 7000);
insert into tmp1 values ('北京','微波爐', 2001, 333);
insert into tmp1 values ('北京','冰箱', 1999, 2323);
insert into tmp1 values ('北京','冰箱', 2000, 1212);
insert into tmp1 values ('北京','冰箱', 2001, 7676);
insert into tmp1 values ('天津','彩電', 1999, 212121);
insert into tmp1 values ('天津','彩電', 2000, 434343);
insert into tmp1 values ('天津','彩電', 2001, 564566);
insert into tmp1 values ('天津','微波爐', 1999, 23432);
insert into tmp1 values ('天津','微波爐', 2000, 232);
insert into tmp1 values ('天津','微波爐', 2001, 34234);
insert into tmp1 values ('天津','冰箱', 1999, 324324);
insert into tmp1 values ('天津','冰箱', 2000, 8987686);
insert into tmp1 values ('天津','冰箱', 2001, 768678);
解題思路:
本題初看起來一般都會下意識選擇通過group by rollup子句生成,但如果你選擇直接通過group by rollup的方式:
JSSWEB> select city, product, year, sum(sales)
2 from tmp1
3 group by city, rollup(product, year)
4 ;
CITY PRODUCT YEAR SUM(SALES)
-------------------- -------------------- ---------- ----------
北京 冰箱 2000 1212
北京 冰箱 1999 2323
北京 冰箱 2001 7676
北京 冰箱 11211
北京 彩電 2000 2500
北京 彩電 1999 3000
北京 彩電 2001 4500
北京 彩電 10000
北京 微波爐 2000 7000
北京 微波爐 1999 800
北京 微波爐 2001 333
北京 微波爐 8133
北京 29344
天津 冰箱 2000 8987686
天津 冰箱 1999 324324
天津 冰箱 2001 768678
天津 冰箱 10080688
天津 彩電 2000 434343
天津 彩電 1999 212121
天津 彩電 2001 564566
天津 彩電 1211030
天津 微波爐 2000 232
天津 微波爐 1999 23432
天津 微波爐 2001 34234
天津 微波爐 57898
天津 11349616
26 rows selected
這跟預想的結果有不小差距。
這是因為要求的資料是涉及邏輯運算的,比如某些資料需要2001年相加,某些資料由2000+2001彙總,因此我們在group by之前需要先按照條件對sales做些處理,彩電要取2000年和2001年的,而微波爐要取2000年的。
JSSWEB> select city,
2 product,
3 year,
4 sales,
5 decode(product,
6 '彩電',
7 decode(year, 2000, sales, 2001, sales, 0),
8 '微波爐',
9 decode(year, 2000, sales, 0)) ns
10 from tmp1;
CITY PRODUCT YEAR SALES NS
-------------------- -------------------- ---------- ---------- ----------
北京 彩電 1999 3000 0
北京 彩電 2000 2500 2500
北京 彩電 2001 4500 4500
北京 微波爐 1999 800 0
北京 微波爐 2000 7000 7000
北京 微波爐 2001 333 0
北京 冰箱 1999 2323
北京 冰箱 2000 1212
北京 冰箱 2001 7676
天津 彩電 1999 212121 0
天津 彩電 2000 434343 434343
天津 彩電 2001 564566 564566
天津 微波爐 1999 23432 0
天津 微波爐 2000 232 232
天津 微波爐 2001 34234 0
天津 冰箱 1999 324324
天津 冰箱 2000 8987686
天津 冰箱 2001 768678
18 rows selected
然後在做sum的時候,我們只需要判斷一下,比如產品為彩電或微波爐的話,sum(ns),否則sum(sales),最後按照城市產品和年份排下序即可:
*space單篇字數限制,請見下一篇~
http://space.itpub.net/?uid-7607759-action-viewspace-itemid-237855
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-237854/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 單條SQL語句實現複雜邏輯的幾個例子(2)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(3)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(4)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(5)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(4)續~SQL
- 單條SQL語句實現複雜邏輯幾例~~SQL
- 簡單的幾條Insert語句引起的邏輯Standby應用延遲的診斷
- 詳解SQL中Groupings Sets 語句的功能和底層實現邏輯SQL
- 複雜控制語句
- 實現四則運算的一條sql語句SQL
- SQL Select語句邏輯執行順序SQL
- 一條簡單SQL語句的構成及語句解析SQL
- 使用vue解決複雜邏輯Vue
- 重構遺留程式碼(3):複雜的條件語句
- 一個複雜的json例子JSON
- SVG 實現複雜線條動畫SVG動畫
- Oracle sql with 語句語法與例子OracleSQL
- 如何將SQL寫成複雜邏輯 和構造資料SQL
- 複雜查詢語句的使用
- 幾個定位、查詢session的sql語句SessionSQL
- 命令列寫複雜語句命令列
- 常見邏輯語句逆向分析
- Oracle AWR中常用到的幾個SQL語句OracleSQL
- 邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹C#
- RxJava 系列番外篇:一個 RxJava 解決複雜業務邏輯的案例RxJava
- 單個SQL語句的10046 traceSQL
- 一條SQL語句的書寫SQL
- 一條很 巧妙的 SQL 語句SQL
- 一條sql語句的優化SQL優化
- 一條SQL語句的旅行之路SQL
- sql語句實現表的行列倒置SQL
- 狀態機解決複雜邏輯及使用
- 如何應對報表開發中的複雜邏輯
- PL/SQL 條件控制語句SQL
- WPF使用Shape實現複雜線條動畫動畫
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-簡單CASESQL
- C++ 條件與 If 語句:掌握邏輯判斷與流程控制精髓C++
- Linux下邏輯測試語句引數和流程控制語句 if語句Linux