2016-02-11 71 views
0

我正在編寫Oracle SQL查詢;在那裏我需要計算小計以及我的正常查詢結果。 對於此決定使用GROUP BY分機號碼(GROUPING SETS)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表達的部分會給出錯誤的假想查詢下方;但是這是我陷入困境的實際情況,我不知道如何達到預期的結果。我唯一的要求是獲得區域明智的小計和盛大的通along以及查詢結果。

我也很感激,如果一些詳細的閱讀材料或視頻建議掌握這一點。

編輯下面 假設是一些示例數據 我想地區 例如總和考慮以下數據 地區國家省城市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 
+0

您可以添加一些示例表數據和預期結果嗎? – jarlh

+0

我不知道我在你的下面站着你..你想要什麼的總和?每個地區的?地區,國家?或者是什麼 – sagi

回答

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) 

最大值基本上是爲了避免必須將這些列放在組中的錯誤,它會選擇最大值。你可以改變它分鐘或如果你想要一個特定的價值告訴我,我會調整它..

按彙總將基本上給你總排。

你的解釋不是很好,所以告訴我,如果這就是你的意思。

1

我必須承認我沒有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; 

BTW :在HAVING條款中,我們要確保三個值都保持相同的值(全0或全1)。沒有像ALL_EQUAL(a,b,c)之類的功能,所以我使用了兩種比較結合AND。但是,如果您發現它更具可讀性,則可以將HAVING子句更改爲:

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