2017-01-17 60 views
4

我有一個數據庫與學生信息和學校成績。然後,我試圖查詢顯示關鍵績效指標的結果集,以反映我們在學校中不同的學生子羣體。最終結果的一個非常粗略的例子是:T-SQL - 更好的替代聯盟所有的分組分析

例表我想創建
注意到,學生羣體有重疊。
同樣的學生可以被包含在Whole YearFemalesNon FSM等:

enter image description here

現在我已經實現了這一點。我已經爲每個子組使用了聚合函數和GROUP BY子句,然後使用UNION ALL將這些查詢組合起來創建表。我的代碼的一個粗略的例子是:

SELECT 'Whole Year' AS [Group], COUNT(student.name) AS [Total No. of Students] 

UNION ALL 

SELECT student.gender AS [Group], COUNT(student.name) AS [Total No. of Students] 
GROUP BY student.gender 

UNION ALL 

SELECT student.fsm AS [Group], COUNT(student.name) AS [Total No. of Students] 
GROUP BY student.fsm 

問題是,我需要爲許多關鍵性能指標和許多子組做這個。用我目前的解決方案,我的代碼非常龐大,而且不易管理。

我猜測可能有一個更優雅的解決方案,所以如果任何人都可以指出我在正確的方向,我將非常感激。

+0

很難說如果沒有看到所有的代碼,但如果你閱讀總結數據'累積'讀它可能是你要找的: https://technet.microsoft.com/ en-us/library/ms189305(v = sql.90).aspx – MightyRearranger

+0

列是動態的,基於「學校成績」中的條目數量? (即%與C +,B +,A + ...等)? –

+0

MightRearranger感謝您的鏈接。在閱讀了我和CUBE運營商一起玩的文章後,如果strickt01沒有回答,它可能會達到我想要的。 –

回答

2

首先,您需要將您的分組創建爲行。目前它們是基於列的(它們基於student中的列值)。因此,使用UNPIVOT運算符將列轉換爲行,每個分組保存所有屬於它的學生ID。

通過將這種映射到一個CTE(本質上是一個臨時表),那麼你可以從這個加入到student和計算你的KPI爲每個分組:

; 
with group_cte (student_group_name, student_id) 
AS 
(
    select student_group, student_id 
    from 
    (select e.student_id as total, 
     case when gender = 'male' then e.student_id end as males, 
     case when gender = 'females' then e.student_id end as females, 
     -- your other groupings 
    from student e) p 
    UNPIVOT 
    (student_id for student_group 
     in (total, males, females)) unpvt 
) 
select student_group_name, count(student_id), -- your KPIs... 
from group_cte c 
inner join student s 
on e.student_id = c.student_id 
group by student_group_name 

這將導致少得多表掃描和清潔SQL。

+0

這已經很好地解決了我的問題,謝謝。我在我的環境中重新生成了這個查詢,它完全符合我的需要。我必須承認,這是我第一次使用CTE或unpivot,而且我還沒有完全理解查詢(還)中發生了什麼。非常感謝,再次感謝。 –

+0

沒問題。一個令人愉快的挑戰!我已經修改了答案,試圖澄清查詢的工作。然而,運行每個組件'SELECT'永遠不會有任何替代品,以便了解它是如何構建的。 – strickt01