2017-02-03 60 views
2

我知道這個問題有點不重要,但我在編寫以下示例的SQL時遇到困難。 如第一表所示,是,我所產生的結果和他們確定爲分析,Oracle SQL分組元素

REGION SUBREGION SUM 
------ --------- ------ 
CORP CORP1  5 
CORP CORP2  10 
CORP CORP3  5 
SB  SB1   10 
SB  SB2   10 
MID  null  10 
LARGE null  20 

但對於總結報告我需要如圖中第二表中顯示結果。任何線索?

REGION SUM 
------ ---- 
CORP 20 
CORP1 5 
CORP2 10 
CORP3 5 
SB  20 
SB1  10 
SB2  10 
MID  10 
LARGE 20 
+0

你有什麼嘗試?你是如何產生第一份報告的(因爲第二份報告只是一個小小的改動)。 – AndySavage

回答

0

聽起來像你需要通過不同的字段來聚合相同的表,但兩個回來就好像它是一個字段。我想到的解決辦法是聯合

select sum() as sum, REGION as sf from table group by REGION 
union ALL 
select sum() as sum, SUB_REGION as sf from table group by SUB_REGION; 

希望基於以下丹的問題,幫助

,我加,如果你不想AGG的丘壑,剛取出的總和和組通過做直工會

select REGION as sf from table 
    union ALL 
    select SUB_REGION as sf from table; 

編輯: 一個更多的思考,也許當你在第一時間查詢,你可能要考慮彙總的概念,作爲一個附加條款上您的組BU和agg功能,可能有助於一舉解決這個問題。

+0

'sum()'?你確定嗎? –

+0

@DanBracuk不,我不確定,但他的例子說「sum」作爲列名,這意味着這將是合適的使用的agg函數。 – markg

1

嘗試使用OLAP函數rollupgrouping這樣的:

select 
    nvl(subregion, region) region, sum("sum") 
from t 
group by region, rollup(subregion) 
having case when count(*) = 1 then 0 else 1 end = grouping(subregion); 

在上文中,

having case when count(*) = 1 then 0 else 1 end = grouping(subregion); 

上述不包括的rolluped行是否有用於該區域只有一行,以便有沒有重複。

另外,請避免在標識符中使用保留關鍵字,例如sum或count。

演示:

SQL> with t(REGION ,SUBREGION ,s) as (
    2 select 'CORP' , 'CORP1' , 5 from dual union all 
    3 select 'CORP' , 'CORP2' , 10 from dual union all 
    4 select 'CORP' , 'CORP3' , 5 from dual union all 
    5 select 'SB'  ,'SB1'   ,10 from dual union all 
    6 select 'SB'  ,'SB2'   ,10 from dual union all 
    7 select 'MID'  , null , 10 from dual union all 
    8 select 'LARGE' , null , 20 from dual 
    9 ) 
10 select 
11 nvl(subregion, region) region, sum(s) 
12 from t 
13 group by region, rollup(subregion) 
14 having case when count(*) = 1 then 0 else 1 end = grouping(subregion); 

REGIO  SUM(S) 
----- ---------- 
SB1   10 
SB2   10 
SB   20 
MID   10 
CORP1   5 
CORP2   10 
CORP3   5 
CORP   20 
LARGE   20 

9 rows selected. 

SQL> 
0

由你正在做的查詢執行同一組,但嘗試使用GROUP BY彙總:

喜歡的東西(未經測試):

select region, subregion, sum(some_column) as sum 
from some_table 
group by rollup(region, subregion) 
order by region, subregion; 
1

簡單地改變您現有的GROUP BY至GROUPING SET

SELECT 
    Coalesce(subregion, region) AS region, 
    Sum(column) 
FROM mytable 
GROUP BY GROUPING SETS(region, subregion) 
HAVING Coalesce(subregion, region) IS NOT NULL