目录
group by 搭配 max(case when..then..end) as field
之前写了一版使用 group by 搭配 case when 来实现行转列,但过于复杂了,今天写一版简洁的
mysql 行转列 case when_globalcoding的博客-CSDN博客
group by 搭配 max(case when..then..end) as field
格式形如:
select max(case when..then..end) as field1 from t1 group by xxx
一、需求
目前有厂区每天的能源数据,数据来源分为两种类型:定时任务从大数据的数据库里每5分钟取一次,input_type为 auto。人工手录,input_type为 input(因为有时系统出问题,数据丢失)。
现在想将每个厂区按照每天来统计当日总量,但需要区分input_type。input_type是同一类型的相加,即auto的加一起,input的加一起。在一天内,如果既有input和auto的数据,则使用input的数据,如果只有auto的数据,则使用auto的数据。
以下就以厂区t1来作为案例,有6天的数据。为了简化,每天只筛选部分数据。(原数据每个厂区每个测点每天有288条数据。)
二、准备工作
1.建表
CREATE TABLE `energy_data` (
`id` varchar(64) NOT NULL ,
`energy_type` varchar(64) NOT NULL COMMENT '能源类型',
`factory` varchar(64) NOT NULL COMMENT '厂区',
`start_time` datetime DEFAULT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`value` decimal(20,5) DEFAULT NULL COMMENT '消耗值',
`input_type` varchar(20) DEFAULT NULL COMMENT '落库方式',
`update_date` datetime DEFAULT NULL COMMENT '修改时间'
)comment '能源数据'
2.数据
INSERT INTO energy_data(id,energy_type, factory, start_time, end_time, value, input_type, update_date)VALUES
('1673669924273856513','1', 't1', '2023-06-01 00:00:00', '2023-06-01 00:15:00', 15.23152, 'input', '2023-06-05 01:15:02'),
('1673669924319993858','1', 't1', '2023-06-02 00:15:00', '2023-06-02 00:30:00', 16.23152, 'input', '2023-06-05 01:15:02'),
('1673669924319993859','1', 't1', '2023-06-02 00:30:00', '2023-06-02 00:45:00', 17.23152, 'auto', '2023-06-05 00:15:02'),
('1673669924319993860','1', 't1', '2023-06-03 00:00:00', '2023-06-03 00:15:00', 18.23152, 'auto', '2023-06-05 01:15:02'),
('1673669924319993861','1', 't1', '2023-06-03 00:15:00', '2023-06-03 00:30:00', 19.23152, 'input', '2023-06-05 01:15:02'),
('1673669924319993862','1', 't1', '2023-06-04 00:00:00', '2023-06-04 00:15:00', 20.23152, 'auto', '2023-06-05 01:15:02'),
('1673669924319993863','1', 't1', '2023-06-05 00:00:00', '2023-06-05 00:15:00', 21.23152, 'auto', '2023-06-05 01:15:02'),
('1673669924319993864','1', 't1', '2023-06-05 00:15:00', '