[英]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.