[英]How would I go about writing the SQL for the attached report?
我們正在從數據系統轉向另一個。 我不得不重寫一些報告,新系統有一個自定義報告模塊,您可以在其中編寫查詢並將其粘貼到窗口中並將其推送給最終用戶。 我有一個報告,所有用戶都在請求,但我無法弄清楚如何編寫它。
它按年級,性別和種族划分了學校人口。 見下文附件。
我寫了這個,按年級分解人口,但不知道從哪里開始。
SELECT
gl.title as Grade,
COUNT (s.student_id)
FROM
students s,
student_enrollment se,
school_gradelevels gl
WHERE
s.student_id = se.student_id
AND se.school_id=gl.school_id
AND se.grade_id=gl."id"
AND se.syear =2012
AND se.end_date IS NULL
AND se.school_id =10
group by gl.title
order by Grade;
作為參考,性別是s.gender,種族是s.race。 我想知道是否需要購買像水晶報告這樣的報告軟件。
沒有數據示例,因此可以預測性別和種族信息是針對學生捕獲的。
你想要做的是獲得一個看起來像這樣的初始表:
GradeLevel | Category | NumOfStudents
------------------------------------------------
PK | B - Male | 10
PK | B - Female | 12
0 | B - Male | 5
0 | B - Female | 6
這樣做很容易實現:
SELECT
gl.title as GradeLevel,
s.Race + '-' +s.Gender as Category
COUNT (s.student_id) as NumOfStudents
FROM
students s,
inner join student_enrollment se on s.student_id = se.student_id,
inner join school_gradelevels gl on se.school_id=gl.school_id AND se.grade_id=gl."id"
WHERE
se.syear =2012
AND se.end_date IS NULL
AND se.school_id =10
group by gl.title, s.Race + '-' +s.Gender
order by Grade;
接下來,您希望通過使用報告工具來使用其SSRS或Crystal或支持矩陣報告的任何其他內容,從數據中提取數據。
如果沒有可用的報表工具知道如何使矩陣使用SQL Pivot
子句: http : //msdn.microsoft.com/en-us/library/ms177410( Pivot
= sql.105).aspx
SELECT GradeLevel, [B-Male], [B-Female] ....
FROM
(
SELECT
gl.title as GradeLevel,
s.Race + '-' +s.Gender as Category
COUNT (s.student_id) as NumOfStudents
FROM
students s,
inner join student_enrollment se on s.student_id = se.student_id,
inner join school_gradelevels gl on se.school_id=gl.school_id AND se.grade_id=gl."id"
WHERE
se.syear =2012
AND se.end_date IS NULL
AND se.school_id =10
group by gl.title, s.Race + '-' +s.Gender
) rawData
PIVOT
(
SUM(NumOfStudents)
FOR Category IN ( [B-Male], [B-Female], ... )
) AS pvt
從根本上說,你必須按照你所計算的一切進行分組,這似乎是年級,種族和性別。 先做到這一點:把所有東西都排成行,總結你需要的方式。
令你困惑的是,該報告有兩個級別的分組:一個是分級,種族和性別,一個是分級和種族。 實際上,它看起來像這樣:
create view V as
SELECT gl.title as Grade
, s.sex
, s.race
, COUNT (s.student_id) as Q
FROM students as s
JOIN student_enrollment as se
ON s.student_id = se.student_id
JOIN school_gradelevels gl
ON se.school_id = gl.school_id
AND se.grade_id = gl.id
WHERE
se.syear = 2012
AND se.end_date IS NULL
AND se.school_id = 10
group by gl.title, s.sex, s.race
select Grade, race, sex, Q
from V
UNION
select Grade, race, 'Z', sum(Q) as Q
from V
group by Grade, race
如何將其轉換為交叉表報告取決於您可以使用的工具。 在SQL中,可以使用pivot
操作符或select
的一系列case
。 訣竅是要注意每個種族需要三列:男性,女性和兩者。 這有點單調乏味,這是一個樣本
select Grade, 1 as sort_order
, max(case race when 1 then
case sex when 'M' then Q end end) as r1mq
, NULL as r1mb
, max(case race when 1 then
case sex when 'F' then Q end end) as r1fq
, max(case race when 2 then
case sex when 'M' then Q end end) as r2mq
, NULL as r2mb
, max(case race when 2 then
case sex when 'F' then Q end end) as r2fq
...
from V group by Grade
UNION
select Grade, 2 as sort_order
, NULL as r1mq
, max(case race when 1 then
case sex when 'Z' then Q end end) as r1bq
, NULL as r1fq
, NULL as r2mq
, max(case race when 2 then
case sex when 'Z' then Q end end) as r2bq
, NULL as r2fq
...
from V group by Grade
order by Grade, sort_order
每個等級產生兩行,每個行的第二行合並學生總數。
你明白了。 您還需要查詢來統計按年級和性別分組的學生,以及僅按年級分組。 這些可以加入您的數據透視查詢的輸出。 對於排在最后一排的比賽總數,以99或者等級聯合起來,使其排在最底層。 結果將與報表的行和列布局相匹配。
with detail as (
select
gl.title as grade, s.race, s.gender, count(s.student_id) total
from
students s
inner join
student_enrollment se using (student_id)
inner join
school_gradelevels gl on se.school_id = gl.school_id and se.grade = gl.id
where
and se.syear = 2012
and se.end_date is null
and se.school_id = 10
group by 1, 2, 3
order by 1, 2, 3
) agg as (
select grade, array_agg(total) total
from detail
group by grade
)
select
grade,
(select sum(e) from unnest(total) s(e)) total_grade,
total[1,1] + total[2,1] + total[3,1] + total[4,1] + total[5,1] + total[6,1] total_F,
total[1,2] + total[2,2] + total[3,2] + total[4,2] + total[5,2] + total[6,2] total_M,
total[1,1] total_A_F,
total[1,2] total_A_M,
total[1,1] + total[1,2] total_A,
total[2,1] total_B_F,
total[2,2] total_B_M,
total[2,1] + total[2,2] total_B,
total[3,1] total_H_F,
total[3,2] total_H_M,
total[3,1] + total[3,2] total_H,
total[4,1] total_I_F,
total[4,2] total_I_M,
total[4,1] + total[4,2] total_I,
total[5,1] total_M_F,
total[5,2] total_M_M,
total[5,1] + total[5,2] total_MM,
total[6,1] total_W_F,
total[6,2] total_W_M,
total[6,1] + total[6,2] total_W,
from agg
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.