Sql DB2(和Derby)Pivot与Case语句连接

Sql DB2(和Derby)Pivot与Case语句连接,sql,db2,derby,Sql,Db2,Derby,我已经看到了这一点,一些答案/评论提到能够通过案例陈述实现同样的效果,但我正在努力实现这一点,可能是因为几年后远离SQL 以下是我拥有的一些数据的快照: ID Date ErrID ErrDesc --------------------------------------- 164 2012-09-21 1402 Large V 164 2012-09-21 1409 Missing 416 2012-09-21 1409

我已经看到了这一点,一些答案/评论提到能够通过案例陈述实现同样的效果,但我正在努力实现这一点,可能是因为几年后远离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和Date加在一起需要在一个查询中是唯一的,该查询将返回如下内容,其中空槽为null。我如何通过案例陈述或其他方式实现这一点?请记住,我认为我们的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 

以下是使用带有聚合函数的
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 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
一样,您将得到多个不需要的行。因此,如果您告诉它您需要每个
errid
max()
值,那么每个记录将获得一行

您将在此处使用子查询。。。你能给我看一下你为第一张图构建的查询吗?尽管我不知道具体是如何实现的,但是你能不能给我展示一下你为第一张图构建的查询appreciated@GeorgeJempty见我的编辑,我包括了一个如何工作的简要说明。如果你需要更多的细节,请告诉我;我当然知道聚合函数,但“max”对我来说似乎并不密切。好一点的角质;)@GeorgeJempty,因为该值是一个字符串,所以使用
max
min
时会卡住它:)