Sql server T-SQL-用于子组分析的Union All的更好替代方案

Sql server T-SQL-用于子组分析的Union All的更好替代方案,sql-server,tsql,Sql Server,Tsql,我有一个包含学生信息和学校成绩的数据库。然后,我试图查询一个结果集,该结果集显示了针对学校中不同学生分组的关键绩效指标。最终结果的一个非常粗略的例子是: 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] G

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

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
我试图创建的示例表
请注意,学生群体有重叠。
同一名学生可以参加
全年
女性
非FSM
等:

现在我已经做到了。我为每个子组使用了聚合函数和GROUPBY子句,然后使用UNIONALL组合这些查询来创建表。我的代码的一个粗略示例是:

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
问题是,我需要对许多关键绩效指标和许多子组执行此操作。在我目前的解决方案中,我的代码非常庞大,而且也不是很容易管理


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

首先,您需要将分组创建为行。目前它们是基于列的(它们基于
student
中的列值)。因此,请使用
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。

很难说没有看到所有的代码,但是如果你阅读一下使用“汇总”汇总数据,可能就是你想要的:根据“学校成绩”中的条目数,列是动态的吗?(即%withC+,B+,A+…等)?感谢您的链接。在阅读了这篇文章之后,我对多维数据集操作符进行了研究,如果strickt01没有回答的话,它可能已经达到了我想要的效果。
CUBE
的问题是,如果你对很多列进行
分组,你最终会得到一个巨大的
子句,以便过滤掉所有你不想要的行。在本例中,我怀疑它最终会比您最初的实现更难管理。这完美地解决了我的问题,谢谢。我已经在我的环境中重新生成了这个查询,它正是我所需要的。我必须承认,这是我第一次使用CTE或unpivot,我还不完全理解查询中发生了什么(目前)。非常感谢,再次感谢。没问题。一个愉快的挑战!我修改了答案,试图澄清问题的运作方式。但是,没有任何方法可以代替运行每个组件
SELECT
,从而了解如何构建它。