Oracle 11g 透视不同行
Posted
技术标签:
【中文标题】Oracle 11g 透视不同行【英文标题】:Oracle 11g Pivot Distinct Rows 【发布时间】: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 行。枢轴可以产生笛卡尔积吗? 【参考方案1】:如果您只想要笛卡尔积
SELECT attr_103.attr_val as "103",
attr_104.attr_val as "104",
attr_136.attr_val as "136"
FROM (SELECT attr_id, attr_val
FROM attr_table
WHERE attr_id = 103) attr_103
CROSS JOIN
(SELECT attr_id, attr_val
FROM attr_table
WHERE attr_id = 104) attr_104
CROSS JOIN
(SELECT attr_id, attr_val
FROM attr_table
WHERE attr_id = 136) attr_136
【讨论】:
以上是关于Oracle 11g 透视不同行的主要内容,如果未能解决你的问题,请参考以下文章