我已经看到了这个SO question (How can I Pivot a table in 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
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
答案 0 :(得分:8)
以下是使用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
请参阅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
编辑#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
结果是:
| 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 | | |
正如您可以看到id=1500
,您将获得多个您不想要的行。因此,如果您告诉它您希望每个max()
都有errid
值,那么每条记录将获得一行。