我在分组2列时遇到问题,不断收到错误:
下面的列'#TEM1.STATUS'在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中。
是我的存储过程代码:
SELECT COUNT(Employee_ID),Roster_Code,STATUS
FROM #TEM1 GROUP BY Roster_Code,Department
TEM1表实际上是一个临时表。我想按部门和名册代码对它们进行分组。 下面是我的TEM1数据:
我的预期输出:
答案 0 :(得分:2)
指定“GROUP BY Roster_Code,Department”基本上意味着您希望在输出中看到表中存在的Roster_Code和Department的每个不同组合的一行。
例如,输出将包含Roster_Code = A,Department = HRS的一行。但是这个组中有一些行有STATUS = IN,而其他行有STATUS = ABSENT。因此,在这种情况下,您希望在输出中显示的内容尚不清楚,因此您会看到错误消息。
这就是为什么你不能简单地选择'STATUS' - 你需要将它包含在GROUP BY子句中(所以你会在每个STATUS的输出中有不同的行)或者使用一些聚合函数告诉SQL Server如何将多个值组合成一个可以输出的值。
看起来您实际上要做的是计算具有“IN”状态的员工数量以及员工总数。这可能意味着您将要使用COUNT()聚合函数。
以下是您想要的输出步骤:
SELECT Department,
Roster_Code,
COUNT(CASE WHEN STATUS='IN' THEN 1 ELSE NULL END) IN_STATUSES,
COUNT(*) TOTAL_STATUSES
FROM #TEM1 GROUP BY Department, Roster_Code
看起来您还希望将除A / B / D / E之外的任何名册代码分类为“其他”,因此我们可以添加另一个步骤:
SELECT Department,
Roster_Code,
COUNT(CASE WHEN STATUS='IN' THEN 1 ELSE NULL END) IN_STATUSES,
COUNT(*) TOTAL_STATUSES
FROM
(
SELECT Department,
CASE WHEN Roster_Code IN ('A','B','D','E') THEN Roster_Code ELSE 'Other' END Roster_Code,
STATUS
FROM #TEM1
) x
GROUP BY Department, Roster_Code
看起来您还想要执行“数据透视”操作,该操作将采用我们当前为A / B / D / E / Other提供的单独行,并将这些行转换为单行中的各自列。然后,您需要将我们当前拥有的状态计数组合成“3/4”形式的字符串 - 这只是连接它们的情况(例如IN_STATUSES +'/'+ TOTAL_STATUSES)。