【问题标题】:SQL query to transpose some columns用于转置某些列的 SQL 查询
【发布时间】:2017-02-07 08:32:30
【问题描述】:

我有一个这样的表 3 列: col1,col2,col3

我必须将这三列分组并计算计数。 我已经通过如下方式完成了小组:

select col5,col3,col2, count(*) from mytable group by col5,col3,col2

COL5    COL3    COL2    COUNT(*)
MOVIL   A       PRE     81.00
MOVIL   B       COM     466.00
MOVIL   A       COM     947.00

col2 中只有两个可能的值,即 PRE 和 COM 但我需要的是一个小改变,如下所示:

COL5    COL3    PRE    COM
MOVIL   A       81     947
MOVIL   B       NULL   466

我认为应该为此使用 PIVOT。 但我不是 SQL 专家。有人可以帮忙吗?

【问题讨论】:

  • 能否提供更多案例的测试数据?单个 COL5 COL3 上可以有多个“PRE”和“COM”吗?

标签: sql oracle oracle11g pivot crosstab


【解决方案1】:
select
  col5,
  col3,
  SUM(CASE WHEN col2='PRE' THEN count ELSE 0 END) as PRE,
  SUM(CASE WHEN col2='COM' THEN count ELSE 0 END) as COM
FROM (select col5,col3,col2, count(*) as count 
      from mytable group by col5,col3,col2) as sub
GROUP BY col5, col3

像这样?

【讨论】:

  • 抱歉之前的评论。它工作完美。非常感谢斯坦
  • @StanislavL :我想在为内联视图提供别名时不需要“as”关键字。
【解决方案2】:

您可以像这样使用 PIVOT(我认为 col2 只有两个值,而不是 col3):

SELECT *
FROM (select col5,col3,col2, count(*) from mytable group by col5,col3,col2)
PIVOT(MAX(CNT) FOR COL2 IN ('PRE','COM'));

【讨论】:

  • 我接受这个答案,因为我更喜欢这个解决方案,尽管 stan 的解决方案对我有好处。
【解决方案3】:

使用枢轴:

         select col5 ,col3,[PRE],[COM]
             from
            (
             select col5,col3,col2, count(*) as count 
                  from #Mytable group by col5,col3,col2
                     )c 
            pivot
            (
            max(count)
                   FOR col2 IN ([com],[pre])
            )as p

如果您有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多