首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL按2列分组数据

SQL按2列分组数据
EN

Stack Overflow用户
提问于 2016-10-17 04:44:53
回答 1查看 66关注 0票数 0

我在对2列进行分组时有问题,请继续获得错误:

列'#TEM1.STATUS‘在select列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。

下面是我的存储过程代码:

代码语言:javascript
复制
SELECT COUNT(Employee_ID),Roster_Code,STATUS
FROM #TEM1 GROUP BY Roster_Code,Department

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

我的预期产出:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-17 05:25:14

指定"GROUP Roster_Code,Department“基本上意味着您希望看到表中存在的Roster_Code和Department的每个不同组合的输出中都有一行。

例如,输出将包含Roster_Code=A、Department=HRS的一行。但是这个组中有一些行是STATUS=IN的,另一些行是STATUS=ABSENT的。因此,在这种情况下,不清楚希望在输出中显示什么,因此会看到一条错误消息。

这就是为什么您不能简单地选择“STATUS”--您需要将它包含在GROUP子句中(因此对于每个状态,您将在输出中有不同的行),或者使用一些聚合函数,它告诉SQL Server如何将多个值组合成一个它可以输出的值。

看起来你实际上要做的是计算出拥有“IN”状态的员工的数量,以及员工的总数。这可能意味着您需要使用COUNT()聚合函数。

下面是实现所需输出的一步:

代码语言:javascript
复制
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之外的任何花名册代码归类为“other”,因此我们可以增加另一步:

代码语言:javascript
复制
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)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40078633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档