【问题标题】:GROUP BY GROUPING SETS按分组集分组
【发布时间】:2016-05-22 02:56:56
【问题描述】:

我正在编写 Oracle SQL 查询;我需要在其中计算小计以及我的正常查询结果。 为此我决定使用GROUP BY 扩展(GROUPING SETS)

由于隐私问题,我不分享实际查询。相反,我在下面写一个最能描述我的小计要求的虚构查询

SELECT  
    region,
    country,
    province,
    city,
    SUM(agg_col1) agg_col1,
    SUM(agg_col2) agg_col2
FROM tbl_name
GROUP BY GROUPING SETS(region)

现在我知道上面的查询会出错,因为并非所有非聚合列都是GROUP BY 表达式的一部分;但这是我被卡住的实际点,我不知道如何达到预期的结果。我唯一的要求是获取区域明智的小计和总计以及查询结果。

如果推荐一些详细的阅读材料或视频来掌握这一点,我将不胜感激。

编辑 假设下面是一些示例数据 我想要地区的总和 例如考虑以下数据 地区 国家 省 城市 Agg 1 Agg 2

r1  c1  p1  ct1 1   1
r1  c1  p1  ct2 1   1
r1  c1  p2  ct1 1   1
r1  c1  p2  ct2 1   1
r1  c2  p1  ct1 1   1
r1  c2  p1  ct2 1   1
r1  c2  p2  ct1 1   1
r1  c2  p2  ct2 1   1
r2  c1  p1  ct1 1   1
r2  c1  p1  ct2 1   1
r2  c1  p2  ct1 1   1
r2  c1  p2  ct2 1   1
r2  c2  p1  ct1 1   1
r2  c2  p1  ct2 1   1
r2  c2  p2  ct1 1   1
r2  c2  p2  ct2 1   1
Along with above 16 rows i need following 3 rows
r1              8   8
r2              8   8
                16  16

【问题讨论】:

  • 能否添加一些示例表数据,以及预期的结果?
  • 我不确定我是否理解你..你想要什么的总和?每个地区的?地区,国家?或者什么

标签: sql oracle11g group-by rollup


【解决方案1】:

试试这个查询:

SELECT  
    region,
    max(country),
    max(province),
    max(city),
    SUM(agg_col1) agg_col1,
    SUM(agg_col2) agg_col2
FROM tbl_name
GROUP BY  ROLLUP (region)

最大值基本上是为了避免您必须将这些列放在组中的错误,它将选择最大值。你可以把它改成 min 或者如果你想要一个具体的值告诉我,我会调整它..

按汇总分组基本上会给你总行。

你的解释不是很好,所以告诉我你是不是这个意思。

【讨论】:

    【解决方案2】:

    我必须承认我没有使用 GROUPING SETS 的经验,所以我不知道这是否会提供一个好的解决方案。

    通常你会用ROLLUP 来构建总数。然后您可以在GROUPING(x) 上应用HAVING 子句以从结果中排除小计:

    SELECT  
      region,
      country,
      province,
      city,
      SUM(agg_col1) agg_col1,
      SUM(agg_col2) agg_col2
    FROM tbl_name
    GROUP BY ROLLUP(region, country, province, city)
    HAVING GROUPING(country) = GROUPING(provice) AND GROUPING(country) = GROUPING(city)
    ORDER BY region, country, province, city;
    

    如果您想要查询结束时的总数,请将您的 ORDER BY 子句更改为:

    ORDER BY GROUPING(country), region, country, province, city;
    

    顺便说一句:在HAVING 子句中,我们要确保三个值都保持相同的值(全为 0 或全为 1)。没有ALL_EQUAL(a,b,c)之类的功能,所以我用了两个比较结合AND。但是,如果您觉得它更具可读性,您可以将HAVING 子句更改为:

    HAVING GROUPING(country) = ALL( GROUPING(provice) , GROUPING(city) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2021-11-04
      • 2019-06-28
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多