假设我有两个表,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 。
以图形方式,我期待这样的事情:
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
我希望你聪明的人能帮助我找出我在这里失踪的东西。
答案 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
。