我有一个包含学生信息和学校成绩的数据库.然后,我尝试查询结果集,显示针对我们在学校的不同学生子组的关键绩效指标.最终结果的一个非常粗略的例子是:
我试图创建的示例表
请注意,学生群体有重叠.
同一个学生可以包括在全年,女性和非FSM等中:
现在我已经实现了这一点.我为每个子组使用了聚合函数和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
问题是,我需要为许多关键绩效指标和许多子组执行此操作.使用我目前的解决方案,我的代码是巨大的,也不是很易于管理.
我猜可能有一个更优雅的解决方案,所以如果有人能指出我正确的方向,我将非常感激.
最佳答案 首先,您需要将分组创建为行.目前它们是基于列的(它们基于学生中的列值).因此,使用UNPIVOT运算符将列转换为行,每个分组包含属于它的所有学生ID.
通过将此映射放入CTE(本质上是临时表),您可以从此加入学生并计算每个分组的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.