【问题标题】:Oracle Pivot - Multi level transformationOracle Pivot - 多级转换
【发布时间】:2019-03-01 07:25:21
【问题描述】:

我有以下数据

C1  C2  C3  c4

1   C   1   2
1   M   0   2
2   C   2   3
2   M   4   3

我希望它被旋转为

C1  C2  C3  C4  C5
#   C   C   M   M
1   1   2   0   2
2   2   3   4   3

我如何做到这一点?

逻辑: 它应始终分组在 C1 级别。 C2 数据将作为 C3 和 C4 中数据的列标题。

【问题讨论】:

  • 您能解释一下从输入数据中获得预期输出的逻辑吗?
  • 在您提出的答案下的评论中 " 假设 C2 中有多个值,例如:A,B ....Z,"。如果这对您很重要,您应该编辑您的问题以包含此类数据并显示您期望从中获得什么结果。

标签: sql oracle oracle11g pivot


【解决方案1】:

您可以使用以下查询中的条件聚合:

with t(C1, C2, C3, C4) as
(
 select 1,'C',1,2 from dual union all
 select 1,'M',0,2 from dual union all
 select 2,'C',2,3 from dual union all
 select 2,'M',4,3 from dual   
)
  select null as C1, min(C2) as C2, min(C2) as C3, max(C2) as C4, max(C2) as C5
    from t
  union all  
  select C1, 
         to_char(sum(case when C2='C' then C3 end)),
         to_char(sum(case when C2='C' then C4 end)),
         to_char(sum(case when C2='M' then C3 end)),
         to_char(sum(case when C2='M' then C4 end))
    from t
   group by C1;

 C1  C2  C3  C4  C5
 --  --  --  --  --
     C   C   M   M
 1   1   2   0   2
 2   2   3   4   3

【讨论】:

  • 你好,假设C2中有多个值,EX:A,B ....Z,那么第一行和其余行之间没有相关性。
  • @RamKumar 是的,你是对的。它解决了您的问题。但不可能考虑动态方案,只要需要保留第一行(如null, C, C, M, M
  • @RamKumar - 您可以发布测试数据的代表性样本,包括边缘情况。要求人们提供解决方案然后说“是的,但是我之前没有提到的其他情况呢?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多