DB2(和Derby)Pivot加入Case Statement

时间:2013-01-03 16:40:02

标签: sql db2 derby

我已经看到了这个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 

1 个答案:

答案 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值,那么每条记录将获得一行。