【面试题】统计产量数据:难点(分组汇总 列转行 查询结果插入)

题目:有一张数据产量表 如下

YearMonthdata
201615000
201629000
.........
20171212000

编写SQL,产生如下数据,并保存到tab2,其中S1 S2 S3 S4代表4个季度

YearS1S2S3S4
20161200300060008000
20171800280070007500

1    首先对问题进行分解,原始数据中是每个月的产量,而我们实际需要的是每个季度,所以先对季度数据进行分组汇总

select `Year`,CONCAT('S',FLOOR((`Month`+2)/3)) as s,sum(data) AS `Data` from table1 GROUP BY `Year` ,s

这里用到了几个函数 

FLOOR() 向下取整    CONCAT(str1,str2...) 字符串连接    sum()汇总求和

得出如下结果

Yearsdata
2016S11800
2016S22000
.........
2017S11500
2017S23216

2 然后对比需求,发现需要对数据进行 列转行处理

SELECT YEAR,  
		MAX(CASE s WHEN 'S1' THEN Data ELSE 0 END ) S1,  
		MAX(CASE s WHEN 'S2' THEN Data ELSE 0 END ) S2,  
		MAX(CASE s WHEN 'S3' THEN Data ELSE 0 END ) S3,  
		MAX(CASE s WHEN 'S4' THEN Data ELSE 0 END ) S4  
FROM (select `Year`,CONCAT('S',FLOOR((`Month`+2)/3)) as s,sum(data) AS `Data` from table1 GROUP BY `Year` ,s) r  
GROUP BY YEAR
这里主要解释几点,首先我们对年份进行分组汇总,然后利用max(Case When)进行列转行处理

3 最后,就是将结果插入一张新表 create table table1 as table2

DROP TABLE IF EXISTS table2;
create table table2 as 	(SELECT YEAR,
	MAX(CASE s WHEN 'S1' THEN Data ELSE 0 END ) S1,
	MAX(CASE s WHEN 'S2' THEN Data ELSE 0 END ) S2,
	MAX(CASE s WHEN 'S3' THEN Data ELSE 0 END ) S3,
	MAX(CASE s WHEN 'S4' THEN Data ELSE 0 END ) S4
FROM (select `Year`,CONCAT('S',FLOOR((`Month`+2)/3)) as s,sum(data) AS `Data` from table1 GROUP BY `Year` ,s) r
GROUP BY YEAR)





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值