【问题标题】:How to include row totals in pivot statement in Oracle?如何在 Oracle 的数据透视语句中包含行总计?
【发布时间】:2020-05-16 06:33:32
【问题描述】:

我有一个数据表,请参阅 使用数据透视语句,我可以按标题细分计数

select * from (
  select * from ta
)
pivot (
COUNT(title)
 for title in ( 'worker', 'manager') )

所以结果是这样的:

STATUS    'worker'  'manager'
started   3         1
finished  4         5
ready     3         4

我需要为行总计添加第三列

STATUS    'worker'  'manager'  Total
started   3         1          4
finished  4         5          9
ready     3         4          7

知道如何在同一个语句中完成此操作吗? 演示在http://sqlfiddle.com/#!4/740fd/1

【问题讨论】:

    标签: sql oracle pivot


    【解决方案1】:

    我只会使用条件聚合而不是pivot。这为您提供了所需的额外灵活性:

    select 
        status,
        sum(case when title = 'worker'  then 1 else 0 end) worker,
        sum(case when title = 'manager' then 1 else 0 end) manager,
        count(*) total
    from ta
    group by status
    

    Demo on DB Fiddle

    状态 |工人 |经理 |全部的 :------- | -----: | ------: | ----: 开始| 3 | 1 | 4 完成| 4 | 5 | 9 准备好了| 3 | 4 | 7

    【讨论】:

    • 这是一个需要枢轴的更复杂查询的简化示例
    • @dataman:我怀疑它确实 需要 pivotpivot 提供的所有内容都可以通过条件聚合来完成(实际上,更多)......
    【解决方案2】:

    使用 SUM() 解析函数得到总数,然后使用 PIVOT

    select 
        status,
        sum(case 
            when title = 'worker' 
              then 1 
                else 0
            end) worker,
        sum(case
            when title = 'manager' 
              then 1 
                else 0 
            end) manager,
        count(*) total
    from ta
    group by status
    

    【讨论】:

      【解决方案3】:

      为整个查询指定一个别名(例如q),以便用星号限定所有列(q.*),然后将所有列相加得到它旁边的total列:

      select q.*, worker + manager as total 
        from ta
       pivot 
       (
        count(title)
        for title in ( 'worker' as worker, 'manager' as manager ) 
       ) q
      

      Demo

      【讨论】:

        【解决方案4】:

        我认为其他示例要简单得多,但这里是在旋转之前使用 cubegrouping 的不同方法:

        select *
        from (
        select decode(grouping(title),1,'total',0,title) title,
               status,
               count(*) cnt
        from ta
        group by status, cube(title) )
        pivot(
          sum(cnt) for title in ('worker','manager','total')
        )
        

        输出:

        |   STATUS | 'worker' | 'manager' | 'total' |
        |----------|----------|-----------|---------|
        | finished |        4 |         5 |       9 |
        |    ready |        3 |         4 |       7 |
        |  started |        3 |         1 |       4 |
        

        http://sqlfiddle.com/#!4/740fd/13/0

        cube 添加到group by 子句中将为您提供该列的小计。默认情况下,它将在该列中显示为 null。您可以在 select 子句中使用grouping 函数来区分总行和普通行(总行将是1,普通行是0)。使用解码将强制将这些总行数设为 'total',这将成为您可以以此为基础的值之一。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-27
          • 1970-01-01
          • 1970-01-01
          • 2021-05-28
          • 2022-10-23
          • 2021-03-10
          相关资源
          最近更新 更多