ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 单条SQL语句实现复杂逻辑的几个例子(1)

单条SQL语句实现复杂逻辑的几个例子(1)

原创 Linux操作系统 作者:junsansi 时间:2008-04-15 12:35:29 0 删除 编辑

一、 按指定规则生成指定商品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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-21

  • 博文量
    640
  • 访问量
    4131497