您的位置:首页 > 职场人生

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

2018-03-09 14:40 507 查看
题目:有一张数据产量表 如下
YearMonthdata
20161500
20162600
.........
201712300
编写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 tab1 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 tab1 GROUP BY `Year` ,s) r
GROUP BY YEAR这里主要解释几点,首先我们对年份进行分组汇总,然后利用max(Case When)进行列转行处理

3 最后,就是将结果插入一张新表 create table tab1 as tab2 create table tab2 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 tab1 GROUP BY `Year` ,s) r
GROUP BY YEAR)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐