如何将 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
列表中。
假设我有两个 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
列表中。