SQL面试题(四)

问题:

显示下表年度为季度,算出总计

+----+------+---------+-----------+

| id | year | quarter | amount    |

+----+------+---------+-----------+

|  1 | 2004 |       1 |   2328.00 |

|  2 | 2004 |       2 |   3822.00 |

|  3 | 2004 |       3 |   7071.00 |

|  4 | 2004 |       4 |   8931.00 |

|  5 | 2005 |       1 |   2633.00 |

|  6 | 2005 |       2 |   3910.00 |

|  7 | 2005 |       3 | 237193.00 |

|  8 | 2005 |       4 | 567444.00 |

|  9 | 2006 |       1 |  12313.00 |

+----+------+---------+-----------+

结果:

+------+----------+---------+-----------+-----------+

| year | 1d       | 2d      | 3d        | 4d        |SUM

+------+----------+---------+-----------+-----------+

| 2004 |  2328.00 | 3822.00 |   7071.00 |   8931.00 |

| 2005 |  2633.00 | 3910.00 | 237193.00 | 567444.00 |

| 2006 | 12313.00 |    NULL |      NULL |      NULL |

+------+----------+---------+-----------+-----------+

 

建表Sql:

DROP TABLE IF EXISTS `sale`;
CREATE TABLE `sale` (
    `id` int(10) unsigned NOT NULL auto_increment,
     `year` int(11) NOT NULL,
      `quarter` int(11) NOT NULL,
    `amount` decimal(15,2) NOT NULL,
    PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

INSERT INTO `sale` VALUES (1,2004,1,2328);
INSERT INTO `sale` VALUES (2,2004,2,3822);
INSERT INTO `sale` VALUES (3,2004,3,7071);
INSERT INTO `sale` VALUES (4,2004,4,8931);
INSERT INTO `sale` VALUES (5,2005,1,2633);
INSERT INTO `sale` VALUES (6,2005,2,3910);
INSERT INTO `sale` VALUES (7,2005,3,237193);
INSERT INTO `sale` VALUES (8,2005,4,567444);
INSERT INTO `sale` VALUES (9,2006,1,12313);

 

方法1:

select a.year, 1d, 2d, 3d, 4d, sum from  
     (select distinct year from sale) a left join
     (select year, amount 1d from sale where quarter=1 group by year) a1d on a.year = a1d.year 
     left join (select year, amount 2d from sale where quarter=2 group by year) a2d on a2d.year=a.year
     left join (select year, amount 3d from sale where quarter=3 group by year) a3d on a3d.year=a.year
     left join (select year, amount 4d from sale where quarter=4 group by year) a4d on a4d.year=a.year
     left join (select year, amount, sum(amount) as sum from sale group by year ) a5d 
on a5d.year=a.year ;

 

方法2:

SELECT year,  
Sum(CASE WHEN quarter = 1 then amount  else 0 end) as 1d,
Sum(CASE WHEN quarter = 2 then amount  else 0 end) as 2d,
Sum(CASE WHEN quarter = 3 then amount  else 0 end) as 3d,
Sum(CASE WHEN quarter = 4 then amount  else 0 end) as 4d,
Sum(amount ) as sum
FROM sale GROUP BY year

 

结果:

+------+----------+---------+-----------+-----------+-----------+

| year | 1d       | 2d      | 3d        | 4d        | sum       |

+------+----------+---------+-----------+-----------+-----------+

| 2004 |  2328.00 | 3822.00 |   7071.00 |   8931.00 |  22152.00 |

| 2005 |  2633.00 | 3910.00 | 237193.00 | 567444.00 | 811180.00 |

| 2006 | 12313.00 |    NULL |      NULL |      NULL |  12313.00 |

+------+----------+---------+-----------+-----------+-----------+

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值