【问题标题】:Convert multiple rows into 1 column without pivot in oracle在oracle中将多行转换为1列而不使用pivot
【发布时间】:2013-12-27 09:56:08
【问题描述】:

我有一个大型 sql 查询,它连接来自多个表的列以提供这种格式的数据:

ID  CODE    Count   Action
-----------------------------
1   A       02      VIEWED
1   A       22      CLICKED
1   A       45      PRINTED
1   A       32      SCHEDULED
2   A       34      VIEWED
2   B       14      CLICKED
2   B       23      PRINTED
2   B       78      SCHEDULED
.
.
X   D       12      CLICKED

action 的值只能是 VIEWED、CLICKED、SCHEDULED、PRINTED。 ID、CODE 的每个组合最多有 4 行。如果没有动作计数说“CLICKED”,则该行不存在

所以,一旦我有了结果集,我想将它展平以拥有这种格式的数据:

Id  CODE   VIEWED   CLICKED  PRINTED  SCHEDULED
-----------------------------------------------
1   A       02         11       45      32
1   B       54         57       89      45
2   B       34         14       23      78
3   G       null       null     28      20
X   D       null       12       null    null

我的查询做了很多事情,但简而言之:

SELECT ID,CODE, ACTION, COUNT(*) AS COUNT  
FROM MY_TABLE 
GROUP BY ID,CODE,ACTION. 

在这个查询中,我想获取结果集,然后展平行。我不能使用 union-alls 等多次查询数据库。

数据库是Oracle 9i数据库,所以pivot功能不起作用。

【问题讨论】:

    标签: sql oracle pivot oracle9i flatten


    【解决方案1】:

    应该能够将SUMCASE 一起使用,从GROUP BY 子句中删除ACTION

    SELECT ID, 
        CODE, 
        SUM(CASE WHEN ACTION = 'VIEWED' THEN 1 ELSE 0 END) Viewed, 
        SUM(CASE WHEN ACTION = 'CLICKED' THEN 1 ELSE 0 END) Clicked, 
        SUM(CASE WHEN ACTION = 'PRINTED' THEN 1 ELSE 0 END) Printed, 
        SUM(CASE WHEN ACTION = 'SCHEDULED' THEN 1 ELSE 0 END) Scheduled
    FROM MY_TABLE 
    GROUP BY ID,
        CODE
    

    【讨论】:

    • 您需要对字段 count 求和,而不是加 1。例如,CASE WHEN ACTION = 'VIEWED' THEN count ELSE 0 END
    • @Dba - 从问题中不能完全确定。 OP 提到 COUNT(*) 创建了 Count 字段。像这样使用SUMCASE 应该会产生相同的结果,但只会在Action 字段上匹配的地方求和。问候。
    • 是的,你是对的,从问题中非常清楚。感谢您的澄清。
    • 对不起,我在原始查询上重新选择:SELECT ID, CODE, SUM(CASE WHEN ACTION = 'VIEWED' THEN COUNT ELSE 0 END) Viewed FROM (SELECT ID,CODE, ACTION, COUNT(*) AS COUNT FROM MY_TABLE ) GROUP BY ID,CODE,ACTION )。正确的 ?非常感谢!!
    【解决方案2】:
     select id,code,decode(action,'VIEWED',count,'null') viewed,
                    decode(action,'CLICKED',count,'null') Clicked, 
                    decode(action,'PRINTED',count,'null') Printed,
                    decode(action,'SCHEDULED',count,'null') Scheduled from you_table groub by ID,CODE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      相关资源
      最近更新 更多