如何将SQL结果显示为列并按DB2中的列对其进行分组?

时间:2016-01-20 22:28:53

标签: sql group-by db2 pivot-table

假设我有两个表,TABLE_A和TABLE_B定义如下:

TABLE_A


    NAME   OTHER_COLUMN
    A05    OTHER_VALUE
    A06    OTHER_VALUE
    A08    OTHER_VALUE

表-B


    NAME    CODE     ATTRIBUTE
    A05     01       A05_01-A
    A05     01       A05_01-B
    A05     02       A05_02-A
    A05     03       A05_03-A
    A05     04       A05_04-A

    A06     01       A06_01-A
    A06     02       A06_02-A
    A06     04       A06_04-A
    A06     04       A06_04-B
    A06     04       A06_04-C
    A06     04       A06_04-D
    A06     05       A06_05-A

    A08     01       A08_01-A
    A08     02       A08_02-A
    A08     02       A08_02-B

我需要做的是查询以将 CODES 的结果显示为具有属性的列 NAME

以图形方式,我期待这样的事情:


    NAME    OTHER_COLUMN    CODE_01     CODE_02     CODE_03     CODE_04     CODE_05
    A05     OTHER_VALUE     A05_01-A    A05_02-A    A05_03-A    A05_04-A    NULL
    A05     OTHER_VALUE     A05_01-B    A05_02-A    A05_03-A    A05_04-A    NULL
    A06     OTHER_VALUE     A06_01-A    A06_02-A    NULL        A06_04-A    A06_05-A
    A06     OTHER_VALUE     A06_01-A    A06_02-A    NULL        A06_04-B    A06_05-A
    A06     OTHER_VALUE     A06_01-A    A06_02-A    NULL        A06_04-C    A06_05-A
    A06     OTHER_VALUE     A06_01-A    A06_02-A    NULL        A06_04-D    A06_05-A
    A08     OTHER_VALUE     A08_01-A    A08_02-A    NULL        NULL        NULL
    A08     OTHER_VALUE     A08_01-A    A08_02-B    NULL        NULL        NULL

我发现为了实现这一点,我需要做一个PIVOT表。在DB2中,可以使用与使用CASE类似的DECODE()函数。

所以,这是我的问题:

SELECT 
    A.NAME, A.OTHER_COLUMN,
    DECODE(B.CODE, '01', B.ATTRIBUTE) AS CODE_01,
    DECODE(B.CODE, '02', B.ATTRIBUTE) AS CODE_02,
    DECODE(B.CODE, '03', B.ATTRIBUTE) AS CODE_03,
    DECODE(B.CODE, '04', B.ATTRIBUTE) AS CODE_04,
    DECODE(B.CODE, '05', B.ATTRIBUTE) AS CODE_05
FROM TABLE_A A
INNER JOIN TABLE_B B
    ON A.NAME = B.NAME

我会在查询结束时使用 GROUP BY A.NAME,A.OTHER_COLUMN 语句,但是如果我这样做,我会为每个NAME值获取一行而不考虑我是否有每个CODE不止一个ATTRIBUTE。在这种情况下,我的结果是:


    NAME    OTHER_COLUMN    CODE_01     CODE_02     CODE_03     CODE_04     CODE_05
    A05     OTHER_VALUE     A05_01-A    A05_02-A    A05_03-A    A05_04-A    NULL
    A06     OTHER_VALUE     A06_01-A    A06_02-A    NULL        A06_04-A    A06_05-A
    A08     OTHER_VALUE     A08_01-A    A08_02-A    NULL        NULL        NULL

我希望你聪明的人能帮助我找出我在这里失踪的东西。

1 个答案:

答案 0 :(得分:1)

在你的问题中破译这个问题有点困难。但是,您似乎希望每个名称都有多个列,每个代码对应一个代码(如果存在)。

如果是,请使用hexViewport枚举它们,然后将其包含在聚合中:

row_number()

如果您愿意,可以在SELECT A.NAME, A.OTHER_COLUMN, MAX(CASE B.CODE WHEN '01' THEN B.ATTRIBUTE END) AS CODE_01, MAX(CASE B.CODE WHEN '02' THEN B.ATTRIBUTE END) AS CODE_02, MAX(CASE B.CODE WHEN '03' THEN B.ATTRIBUTE END) AS CODE_03, MAX(CASE B.CODE WHEN '04' THEN B.ATTRIBUTE END) AS CODE_04, MAX(CASE B.CODE WHEN '05' THEN B.ATTRIBUTE END) AS CODE_05 FROM TABLE_A A INNER JOIN (SELECT B.*, ROW_NUMBER() OVER (PARTITION BY B.NAME, B.CODE ORDER BY B.ATTRIBUTE) as seqnum FROM TABLE_B B ) B ON A.NAME = B.NAME GROUP BY A.NAME, A.OTHER_COLUMN, seqnum; 列表中添加seqnum