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 透视不同行的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g 透视查询优化 - 多行到单行

Oracle SQL 数据透视查询

使用数据透视在 Oracle 中显示列名

Oracle 动态透视

Oracle 组和数据透视 - Oracle 中的动态数据透视

如果 Oracle OBIEE 中的列为空,则隐藏数据透视表中的列