[英]How to display SQL results as columns and group them by a column in DB2?
假设我有两个表,TABLE_A和TABLE_B定义如下:
NAME OTHER_COLUMN A05 OTHER_VALUE A06 OTHER_VALUE A08 OTHER_VALUE
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.