【问题标题】:pivoting a sql query going from wide to long format in ORACLE在 ORACLE 中将 sql 查询从宽格式转换为长格式
【发布时间】:2025-12-10 11:20:11
【问题描述】:

我有一个这样的 sql 查询

select
 group, 
sum(case when field1 = 'a' then 1 else 0 end ) as typea,
sum(case when field1 = 'b' then 1 else 0 end ) as typeb
from mytable
group by group

结果是这样的

group  typea    typeb
 1      10         30
 2      20          40

效果很好,但我需要这样的结果:

group  types     value
1       typea     10
2       typea      30
1       typeb      20
2       typeb      40

有没有办法修改这个查询:

select
 group, 
sum(case when field1 = 'a' then 1 else 0 end ) as typea,
sum(case when field1 = 'b' then 1 else 0 end ) as typeb
from mytable
group by group

以便它返回我需要的结果?

注意——我正在使用 ORACLE

谢谢。

【问题讨论】:

    标签: mysql sql oracle


    【解决方案1】:

    使用UNION ALL

    select "group", 
          'typea' AS type,
           sum(1) AS value
    from mytable
    where field1 = 'a'
    group by "group"
    UNION ALL
    select "group", 
           'typeb',
           sum(1)
    from mytable
    where field1 = 'b'
    group by "group"
    

    【讨论】:

      【解决方案2】:

      数据已经正确组织,您只需进行不同的分组。

      SELECT "group", 'type'||field1 as Types, sum(1) as value
      FROM mytable
      GROUP BY "group", 'type'||field1
      ORDER BY Types, "group"
      

      注意组是保留字,所以我把它放在“”中,如果它的列和类型可以重命名,你最好长期使用,因为一个是保留字,另一个是关键字。

      With MyTable("group",field1) as  (select 1, 'a' from dual UNION ALL
      select 1 , 'a' as field1 from dual UNION ALL
      select 1 , 'b' as field1 from dual UNION ALL
      select 1 , 'b' as field1 from dual UNION ALL
      select 2 , 'a' as field1 from dual UNION ALL
      select 2 , 'a' as field1 from dual UNION ALL
      select 2 , 'a' as field1 from dual UNION ALL
      select 2 , 'b' as field1 from dual)
      SELECT "group", 'type'||field1 as Types, sum(1) as value
      FROM mytable
      GROUP BY "group", 'type'||field1
      

      虽然你为什么需要连接'type'作为field1的前缀是奇怪的。它可能只是一个简单的(无旋转)计数,并且似乎只需要分组。

      SELECT "group", field1 as Types, count(*) as value
      FROM mytable
      GROUP BY "group", field1
      ORDER BY Types, "group"
      

      【讨论】: