【发布时间】:2016-04-18 13:26:02
【问题描述】:
我正在尝试创建一个以可读格式打印我们的家庭房间数量的报告。我们目前有一个手动填写的 Excel 模板,但我想在 SQL 中自动化这个过程,这样我们就可以从数据库中提取报告。由于这是公立学校数据,我不会发布我的子查询或“真实”数据,但我会尽可能具体。
我有一个子查询,它提取我命名为 Data 的 student_ID、School_Title、Grade_Level 和 HomeRoom。出于本次讨论的目的,我们假设 Data 实际上是我数据库中的一个表。我一直在研究使用支点,但它似乎并没有满足我的需要。我们有多所学校,每所学校每个年级都有多个班主任。每所学校的每个年级都有不同数量的班主任,具体取决于学校的规模。 (所以学校 1 可能只有 2 个幼儿园班,但 School4 可能有 4 个幼儿园班)。
数据如下所示:
Student_ID School_Title Grade_Level HomeRoom
12345 School1 KA HR1
23456 School1 KP HR2
34567 School1 01 HR3
45678 School1 01 HR4
......
56789 School7 06 HR100
我现在使用的查询是(在 SQL Server 2012 中):
SELECT *
FROM Data
PIVOT (Count(student_ID)
FOR GRADE_LEVEL IN ([KA],[KP],[01],[02],[03],[04],[05],[06])
) as PivotStudents
ORDER BY School_Title
但我得到的是:
School_Title HomeRoom KA KP 01 02 03 04 05 06
School 1 HR1 25 0 0 0 0 0 0 0
School 1 HR2 0 26 0 0 0 0 0 0
School 1 HR3 0 0 19 0 0 0 0 0
School 1 HR4 0 0 21 0 0 0 0 0
....
School 7 HR100 0 0 0 0 0 0 0 27
我想出来的是:
School_Title HR KA HR KP HR 01 HR 02...
School 1 HR1 25 HR2 26 HR3 19 HR5 23
School 1 HR4 21
...
School 7 HR91 19 HR92 19 HR93 20 HR98 21
School 7 HR94 17 HR95 23 HR96 18 HR99 24
School 7 HR97 22
我不在乎哪些是“连续”组合在一起的。因此,在我的脑海中,HR3 恰好是找到的第一个 01 年级班主任,所以它在第 1 行。但是 HR4 也是第 1 学校的 01 年级班主任,并且是下一个找到的,所以它进入第 2 行。
一个班也可能有多个年级(虽然只有两种情况,但我需要考虑到这是可能的)。
所以基本上,我想要的输出在 SQL 中是否可行?我是否需要从数据库中取出 Crystal 或其他东西才能将数据“放置”到我想要的位置,或者我是否可以为 SQL 提供足够的信息来按照我的意愿对其进行格式化。
谢谢! 数据库
【问题讨论】:
-
我不确定我是否正确理解了您的要求。无论顺序如何,您都希望它们在同一行中?或者你到底想要什么?
-
基本上我想摆脱很多零显示:) 因此,在第一个表(使用我当前的 SQL)中,每个教室都是一行,并显示每个年级的学生人数。而在第二张表(我想要的理想)中,它列出了每个年级找到的第一个班主任。因此,为该年级找到的第一个班主任(按班主任名称的 alpha 排序就可以了)显示在第 1 行的那个年级列中,而该年级的第二个班主任显示在第 2 行的那个年级列中...
-
所以基本上每所学校一条线可以做到吗?如果是这样,您应该尝试
GROUP BY School_Title -
我希望!如果每所学校的每个年级只有一个班主任,我会选择按组上课和按顺序上课,而根本不会搞乱支点。老实说,我开始认为我正在尝试做的事情仅在 SQL 中是不可能的......
-
哦,好的,我明白了。能否举个例子说明
Data表是如何构造的?
标签: sql-server-2012 pivot