我正在编写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表达式的一部分;但这是我被卡住的实际原因,我不知道如何达到预期的结果。我唯一的要求是获得区域分类汇总和总计以及查询结果。
如果能推荐一些详细的阅读材料或视频来掌握这一点,我也会很感激。
编辑假设下面是一些样本数据,我想要地区的总和,例如,考虑下面的数据地区国家、省、城市组1、组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发布于 2016-02-11 19:21:25
尝试此查询:
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基本上会给出总行。
你的解释不是很好,所以告诉我你是不是这个意思。
发布于 2016-02-11 19:37:23
我必须承认我没有使用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) )https://stackoverflow.com/questions/35337531
复制相似问题