SQL组数据按2列

时间:2016-10-17 04:44:54

标签: sql-server stored-procedures

我在分组2列时遇到问题,不断收到错误:

  

列'#TEM1.STATUS'在选择列表中无效,因为它不是   包含在聚合函数或GROUP BY子句中。

下面的

是我的存储过程代码:

SELECT COUNT(Employee_ID),Roster_Code,STATUS
FROM #TEM1 GROUP BY Roster_Code,Department

TEM1表实际上是一个临时表。我想按部门和名册代码对它们进行分组。 下面是我的TEM1数据: enter image description here

我的预期输出:

enter image description here

1 个答案:

答案 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)。