【问题标题】:How to group table SQL ORACLE table with specific rows also present如何使用特定行对表 SQL ORACLE 表进行分组
【发布时间】:2018-11-18 07:06:06
【问题描述】:

我有这样的表:

Area | Client | Month
a    | A      | 1
a    | B      | 1
b    | C      | 1
a    | A      | 2
b    | B      | 2

我如何对这个表进行分组和汇总,以获得如下结果:

Area | Client | Month | Count
a    | A      | 1     | 1
a    | B      | 1     | 1
a    |        | 1     | 2
b    | C      | 1     | 1
b    |        | 1     | 1
     |        | 1     | 3
a    | A      | 2     | 1
a    | B      | 2     | 1
a    |        | 2     | 2
     |        | 2     | 2
     |        |       | 5

我想按地区和月份计算客户,但也列出客户列。我很难在存在客户列的情况下使用“分组依据”。 我也想按月“排序”,但摘要也要正确排序。

【问题讨论】:

  • 为什么在月份列中包含客户数量?这没有多大意义。你绝对需要总行数吗?如果没有,您可以使用分析函数将相关计数添加为每行的列。
  • 谢谢,我的错,计数应该作为另一列。

标签: sql database oracle group-by rollup


【解决方案1】:

我更喜欢grouping sets 而不是cube 或rollup,因为它更灵活。

但是,使用它们的关键是您需要一个聚合。所以,我想你想要一个第四栏:

select area, client, month, count(*) as cnt
from t
group by grouping sets ( (area, client, month), (area, month), (month));

【讨论】:

  • 我认为分组集应该是( (area, client, month), (area, month), (month), () )才能达到OP的结果。
【解决方案2】:

Oracle 已经有rollup and cube grouping functions 用于此类查询,请使用:

select area, client , month, sum(month) count
  from mytable
 group by rollup(area, client,month) 
 order by area, client;

或者,这将产生小计的小计:

select area, client , month, sum(month) count
  from mytable
 group by cube(area, client,month) 
 order by area, client, month;

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2019-04-14
    • 2023-01-11
    相关资源
    最近更新 更多