2014-01-15 35 views
3

假設我有包括學生的SSN,大學校園,他們出席,併爲某一年的工資數據。是這樣的...保持與GROUP BY CUBE唯一行

create table #thetable (SSN int, campus int, wage int); 

insert into #thetable(SSN, campus, wage) 
values 
(111111111,1,100), 
(111111111,2,100), 
(222222222,1,250), 
(222222222,2,250), 
(333333333,1,50), 
(444444444,2,400); 

現在,我希望讓學生在每個校園的平均工資,學生的所有校區的平均工資放在一起。所以我做這樣的事情:

select campus, avg(wage) 
from #thetable 
group by cube(campus); 

問題是,我不想重複計算在校園分組在一起時參加兩個校園的學生。這是輸出我得到(雙數學生111111111和2222222222):

Campus (no column name) 
1  133 
2  250 
NULL  191 

我期望的輸出是這樣的(不重複計算):

Campus (no column name) 
1  133 
2  250 
NULL  200 

可以這樣不使用多個查詢來完成和UNION運算符?如果是這樣,怎麼樣? (順便說一句,我知道這表是不歸......會正火幫忙嗎?)

+0

我在CTE中徘徊 - 從技術上說,只有一個查詢 - 但無法避免UNION和多個全表掃描。除了各種CUBE操作員(我從來沒有使用過),我不認爲這是可能的。 –

+0

沒有UNION和子查詢。這似乎很難/不可能。 –

回答

0

用相關的子查詢找出它。適用於我。

select campus, 
(
    select avg(wage) 
    from 
    (
     select ssn, campus, wage, row_number() over(partition by SSN order by wage) as RN 
     from #thetable as inside 
     where (inside.campus=outside.campus or outside.campus is null) 
    ) as middle 
    where RN=1 
) 
from #thetable outside 
group by cube(campus); 
1

不能與一列做到這一點。 cube將基於每行上的計算彙總值。因此,如果一個計算中包含一行,它將包含在總和中。

你可以做到這一點,雖然,通過加權由1除以頻率值。這個「平均分」的學生跨校園到每個加1:

select campus, avg(wage) as avg_wage, sum(wage*weight)/sum(weight) avg_wage_weighted 
from (select t.*, (1.0/count(*) over (partition by SSN)) as weight 
     from #thetable t 
    ) t 
group by cube(campus); 

第二列應該是你想要的值。然後,您可以在子查詢這進一步嵌入得到一個列:

select campus, (case when campus is null then avg_wage_weighted else avg_wage end) 
from (select campus, avg(wage) as avg_wage, sum(wage*weight)/sum(weight) avg_wage_weighted 
     from (select t.*, (1.0/count(*) over (partition by SSN)) as weight 
      from #thetable t 
      ) t 
     group by cube(campus) 
    ) t 

Here是SQL小提琴顯示解決方案。

+0

感謝分享!當只有一個維度使用立方體時,絕對有效,但不幸的是,我的實際使用案例有多個維度......校園,學位類型,學習範圍。現在,顯然,我仍然可以使用這種方法,但隨着維度數量的增加,它會呈指數級增長,我認爲我會堅持相關的子查詢。它的定義明顯緩慢,但我不願意根據眼前的情況來處理這個問題。 –

+0

@JohnChrysostom。 。 。加權行的想法,因此所有行加起來爲1,應該跨越多個維度。 –

+0

對。就像我說的,我仍然可以使用這種方法,它會變得更加複雜。如果有3個維度,那麼我需要計算7個不同的權重來說明分組變量可以捲起來的所有不同方式,4個維度將需要15個不同的權重等。它很快失去控制。 –