T-SQL - 更好地替代Union All以分析子组

时间:2017-01-17 11:13:53

标签: sql-server tsql

我有一个包含学生信息和学校成绩的数据库。然后,我尝试查询结果集,显示针对我们在学校的不同学生子组的关键绩效指标。最终结果的一个非常粗略的例子是:

示例表我正在尝试创建
请注意,学生群体有重叠 同一位学生可以加入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

问题是,我需要为许多关键绩效指标和许多子组执行此操作。使用我目前的解决方案,我的代码是巨大的,也不是很易于管理。

我猜可能有一个更优雅的解决方案,所以如果有人能指出我正确的方向,我将非常感激。

1 个答案:

答案 0 :(得分:2)

首先,您需要将分组创建为行。目前,它们是基于列的(它们基于dim redVector as long ' or other appropriate variable type ' ***** code that defines the red vector ***** if range("e5").interior.color = redVector then ' do stuff end if 中的列值)。因此,使用student运算符将列转换为行,每个分组包含属于它的所有学生ID。

通过将此映射放入CTE(本质上是临时表),您可以从此加入UNPIVOT并计算每个分组的KPI:

student

这会导致更少的表扫描和更清晰的SQL。