繁体   English   中英

使用 case 语句在 SQL 中对表进行透视

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM