繁体   English   中英

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

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

假设我有两个表,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相关联的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表。 在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;

如果需要,可以在SELECT列表中包括seqnum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM