[英]pivotting a table in SQL using case statements
我有下表:
tbl
ID service_date vax_type dose age gender
A 2020-01-04 pfizer dose1 30 M
A 2020-02-04 pfizer dose2 30 M
B 2020-02-10 pfizer dose1 40 M
B 2020-03-04 pfizer dose2 40 M
C 2020-03-14 moderna dose1 50 F
C 2020-04-01 moderna dose2 50 F
我想以此为基础:
ID vax_type dose1 dose2 age gender
A pfizer 2020-01-04 2020-02-04 30 M
B pfizer 2020-02-10 2020-03-04 40 M
C moderna 2020-03-14 2020-04-01 50 F
我使用了 case 语句并尝试了:
select ID, vax_type, age, gender
case when dose = 'dose1' then service_date else null end as dose1,
case when dose = 'dose2' then service_date else null end as dose2
来自tbl;
这给了我错误。 这种方法的一个变体有效,但没有给我想要的桌子。 像这样的简单枢轴操作有更好的选择吗?
聚合然后取CASE
表达式的MAX
:
SELECT ID, vax_type, age, gender,
MAX(CASE WHEN dose = 'dose1' THEN service_date END) AS dose1,
MAX(CASE WHEN dose = 'dose2' THEN service_date END) AS dose2
FROM yourTable
GROUP BY ID, vax_type, age, gender;
您也可以尝试使用 PIVOT 功能,也许它也适合您。
create table tbl (id varchar2,service_date date, vax_type varchar2, dose varchar2, age integer, gender varchar2(1));
select * from tbl
insert into tbl Values('A', '2020-01-04', 'pfizer' , 'dose1', 30 , 'M');
insert into tbl Values('A', '2020-02-04', 'pfizer', 'dose2', 30 , 'M');
insert into tbl Values('B', '2020-02-10', 'pfizer', 'dose1' , 40, 'M');
insert into tbl Values('B', '2020-03-04', 'pfizer', 'dose2' , 40, 'M');
insert into tbl Values('C', '2020-03-14', 'moderna', 'dose1', 50, 'F');
insert into tbl Values('C', '2020-04-01', 'moderna', 'dose2' , 50 , 'F');
select *
from tbl
pivot(max(service_date) for dose in ('dose1', 'dose2'))
as p(ID, vax_type, age, gender,dose1, dose2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.