首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GROUP BY GROUPING SETS

GROUP BY GROUPING SETS
EN

Stack Overflow用户
提问于 2016-02-11 19:01:57
回答 2查看 1.1K关注 0票数 0

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

由于隐私问题,我不分享实际查询。相反,我在下面写了一个假想的查询,它最好地描述了我的小计需求

代码语言:javascript
复制
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表达式的一部分;但这是我被卡住的实际原因,我不知道如何达到预期的结果。我唯一的要求是获得区域分类汇总和总计以及查询结果。

如果能推荐一些详细的阅读材料或视频来掌握这一点,我也会很感激。

编辑假设下面是一些样本数据,我想要地区的总和,例如,考虑下面的数据地区国家、省、城市组1、组2

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2016-02-11 19:21:25

尝试此查询:

代码语言:javascript
复制
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)

最大值基本上是为了避免必须将这些列放入group by中的错误,它将选择最大值。您可以将其更改为min,或者如果您需要一个特定值,请告诉我,我将对其进行调整。

Group by rollup基本上会给出总行。

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

票数 1
EN

Stack Overflow用户

发布于 2016-02-11 19:37:23

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

通常情况下,您会使用ROLLUP构建总计。然后,您可以对GROUPING(x)应用HAVING子句,以便从结果中排除小计:

代码语言:javascript
复制
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子句更改为:

代码语言:javascript
复制
ORDER BY GROUPING(country), region, country, province, city;

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

代码语言:javascript
复制
HAVING GROUPING(country) = ALL( GROUPING(provice) , GROUPING(city) )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35337531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档