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

How to display SQL results as columns and group them by a column in DB2?

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

TABLE_A


    NAME   OTHER_COLUMN
    A05    OTHER_VALUE
    A06    OTHER_VALUE
    A08    OTHER_VALUE

TABLE_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 的结果显示为具有每个 [=30] 关联的 ATTRIBUTES 的列=]姓名。

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


    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 table。在 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

希望各位大侠帮我看看我这里漏了什么。

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

如果是这样,请使用 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 添加到 SELECT 列表中。