【面试题】统计产量数据:难点(分组汇总 列转行 查询结果插入)
2018-03-09 15:08
471 查看
题目:有一张数据产量表 如下
编写SQL,产生如下数据,并保存到tab2,其中S1 S2 S3 S4代表4个季度
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()汇总求和
得出如下结果
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 table2DROP 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)
Year | Month | data |
2016 | 1 | 5000 |
2016 | 2 | 9000 |
... | ... | ... |
2017 | 12 | 12000 |
Year | S1 | S2 | S3 | S4 |
2016 | 1200 | 3000 | 6000 | 8000 |
2017 | 1800 | 2800 | 7000 | 7500 |
FLOOR() 向下取整 CONCAT(str1,str2...) 字符串连接 sum()汇总求和
得出如下结果
Year | s | data |
2016 | S1 | 1800 |
2016 | S2 | 2000 |
... | ... | ... |
2017 | S1 | 1500 |
2017 | S2 | 3216 |
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 table2DROP 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)
相关文章推荐
- 【面试题】统计产量数据:难点(分组汇总 列转行 查询结果插入)
- MYSQL数据库(十)- 数据表的插入(insert)、删(delete)、改(update)、查(select)、group by 分组、having语句设置分组条件,order by查询结果排序,
- java读取csv数据到list缓存,并对list集合分组统计结果
- 利用 GROUP BY 和 MAX 实现对表数据分组统计后的过滤查询(Oracle920)
- 求思路:递归查询后,数据根据父节点分组统计!!!
- MySQL将查询结果插入到数据表中
- MySQL将查询结果插入到数据表中
- 分组查询统计数据 再连接字段修改另一个字段的内容(临时表temporary 和 视图view)
- mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法
- mysql查询分组显示数据结果之GROUP_CONCAT
- SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- MySql insert:当通过条件查询结果存在该条数据则不插入,否则执行insert
- 数据分组--聚合函数使用范例(小计,统计,汇总)实例
- oracle中查询出A表的结果,并将A表中的数据插入到B表中,对于A表中已经存在的B表数据不在插入
- MySQL将查询结果插入到数据表中
- mysql按照每天分组查询数据结果排序不是从1到31而是1后接10
- mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法。
- MySQL将查询结果插入到数据表中
- 数据的查询、汇总 、统计和分析