Sql DB2(和Derby)Pivot与Case语句连接
我已经看到了这一点,一些答案/评论提到能够通过案例陈述实现同样的效果,但我正在努力实现这一点,可能是因为几年后远离SQL 以下是我拥有的一些数据的快照: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
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
时会卡住它:)