我已经看到了这个问题(如何在DB2中透视表?)并且一些答案/评论提到能够在案例陈述中实现相同的效果但是我正在努力实现这一点,可能是由于离SQL太多年了.
这是我的一些数据的快照:
ID Date ErrID ErrDesc
---------------------------------------
164 2012-09-21 1402 Large V
164 2012-09-21 1409 Missing
416 2012-09-21 1409 Missing
1380 2012-09-21 1411 n - Mis
1500 2012-09-17 1411 n - Mis
1500 2012-09-21 1402 Large V
Run Code Online (Sandbox Code Playgroud)
一起使用的ID 和日期在查询中必须是唯一的,该查询将返回诸如以下内容,其中空槽为空.如何通过案例陈述或其他方式实现这一目标?请记住,我不认为我们的DB2版本支持"解码",我需要的SQL也需要能够在Derby上运行以进行测试.提前致谢.
ID Date Err1402 Err1409 Err1411
-----------------------------------------------------------------------
164 2012-09-21 Large V Missing
416 2012-09-21 Missing
1380 2012-09-21 n - Mis
1500 2012-09-17 n - Mis
1500 2012-09-21 Large V
Run Code Online (Sandbox Code Playgroud)
以下是使用CASE聚合函数的查询版本:
select id,
date,
max(case when errid = 1402 then ErrDesc else '' end) Err1402,
max(case when errid = 1409 then ErrDesc else '' end) Err1409,
max(case when errid = 1411 then ErrDesc else '' end) Err1411
from yourtable
group by id, date
order by id
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo(sql server版本).你可以用一个替换空字符串null.
select id,
date,
max(case when errid = 1402 then ErrDesc else null end) Err1402,
max(case when errid = 1409 then ErrDesc else null end) Err1409,
max(case when errid = 1411 then ErrDesc else null end) Err1411
from yourtable
group by id, date
order by id
Run Code Online (Sandbox Code Playgroud)
编辑#1:使其正常工作的关键是聚合函数.该CASE语句将每个ErrId值放入列中,但如果不使用聚合函数,则每个id,date会有多行.所以如果你使用:
select id,
date,
(case when errid = 1402 then ErrDesc else '' end) Err1402,
(case when errid = 1409 then ErrDesc else '' end) Err1409,
(case when errid = 1411 then ErrDesc else '' end) Err1411
from yourtable
order by id
Run Code Online (Sandbox Code Playgroud)
结果是:
| ID | DATE | ERR1402 | ERR1409 | ERR1411 |
-------------------------------------------------------------------------
| 164 | September, 21 2012 00:00:00+0000 | Large V | | |
| 164 | September, 21 2012 00:00:00+0000 | | Missing | |
| 416 | September, 21 2012 00:00:00+0000 | | Missing | |
| 1380 | September, 21 2012 00:00:00+0000 | | | n - Mis |
| 1500 | September, 17 2012 00:00:00+0000 | | | n - Mis |
| 1500 | September, 21 2012 00:00:00+0000 | Large V | | |
Run Code Online (Sandbox Code Playgroud)
如您所见,id=1500您将获得多个您不想要的行.因此,如果您告诉它您想要max()每个值的值errid,那么每条记录将获得一行.