【问题标题】:DB2 (and Derby) Pivot Join with Case StatementDB2(和 Derby)使用 Case 语句进行 Pivot Join
【发布时间】:2013-01-03 16:40:02
【问题描述】:

我已经看到了这个SO question (How can I Pivot a table in DB2?) 并且一些答案/cmets 提到能够通过 case 语句实现相同的效果,但我正在努力实现这一目标,可能是因为几年后远离 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 

【问题讨论】:

  • 你将在这里使用一个子查询...你能告诉我你为第一个图表构建的查询吗

标签: sql db2 derby


【解决方案1】:

以下是使用 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,您将获得多行您不想要的。因此,如果您告诉它您想要每个erridmax() 值,那么您将获得每条记录一行。

【讨论】:

  • 工作就像一个魅力,虽然我不明白具体如何——任何对实施的见解将不胜感激
  • @GeorgeJempty 查看我的编辑,我简要说明了它的工作原理。如果您需要更多详细信息,请告诉我。
  • 知道了;我当然知道聚合函数,但“max”对我来说似乎并不密切。不错的骗术;)
  • @GeorgeJempty 因为该值是您使用maxmin 卡住的字符串。 :)
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 2022-12-23
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多