【发布时间】:2012-05-23 21:11:42
【问题描述】:
我有这样的数据:
**ATTR_ID** **ATTR_VAL**
103 E
104 F
136 E
136 U
我想使用 PIVOT 将数据转换成这个:
**103** **104** **136**
E F U
E F E
在 PIVOT 中使用 MAX() 会产生一条记录。我需要得到这两个记录。一个属性id可以有多个属性值。
SELECT *
( SELECT ATTR_ID, ATTR_VAL FROM DATA_TABLE )
PIVOT (MAX(ATTR_VAL) FOR ATTR_ID IN (103,104,136))
我使用 PIVOT 会解决这个问题吗?
【问题讨论】:
-
为什么103有第二个E,104有第二个F?该数据不会出现在您的样本中。你只是抄下来吗?如果 104 和 136 在表中都有两行,你怎么知道哪些行在旋转输出中一起出现?还是没关系?如果104有3行,你怎么知道是从136往下复制U还是E?
-
感谢您的回复。你是对的,数据没有出现在样本中,但我必须创建它。另一位开发人员向我解释说,我需要创建“笛卡尔积”。所有数据都存储在嵌套行中。我必须将行更改回列,以便我可以加入另一个表。这会让您更深入地了解这个问题吗?
-
所以,如果你想要一个笛卡尔积,这意味着如果 103 有 2 行,104 有 3 行,136 有 5 行,你最终会得到 2*3*5 = 30 行。对吗?
-
是的,你是对的。在这种情况下,我会得到 30 行。枢轴可以产生笛卡尔积吗?
标签: sql oracle oracle11g distinct pivot