單條SQL語句實現複雜邏輯的幾個例子(1)

junsansi發表於2008-04-15

一、 按指定規則生成指定商品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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章