我正在计算每个房间和每个建筑物的会话数量。截至目前,我已经写了这个查询:
SELECT COUNT(BUILDINGNO)*COUNT(ROOMNO), BUILDINGNO, ROOMNO
FROM ROOM
GROUP BY BUILDINGNO
ORDER BY ROOMNO;
但是我收到一条错误消息,说它正在按表达式丢失一组。
答案 0 :(得分:4)
我认为你应该通过建筑和房间进行聚合。此外,您省略了一个基于房间和建筑物记录出勤率的表格。您的查询应如下所示:
SELECT
r.BUILDINGNO,
r.ROOMNO,
COUNT(cs.SPEAKERID) AS cnt
FROM ROOM r
LEFT JOIN CONFERENCESESSION cs
ON r.BUILDINGNO = cs.BUILDINGNO AND
r.ROOMNO = cs.ROOMNO
GROUP BY
r.BUILDINGNO,
r.ROOMNO
ORDER BY
r.BUILDINGNO,
r.ROOMNO;
在ROOM
和CONFERENCESESSION
表之间进行左连接非常重要,因为可能某个房间没有任何会话。但我们仍然希望报告该房间的总数为零。
答案 1 :(得分:1)
发生此错误是因为SELECT子句中有一个字段不在GROUP BY子句中或正在聚合。
此外,使用conferencesession表并加入BUILDINGNO和ROOMNO字段可以让您查看会话数。
尝试此查询:
SELECT
r.BUILDINGNO,
r.ROOMNO,
COUNT(s.SESSIONID) AS session_count
FROM room r
LEFT OUTER JOIN conferencesession s ON r.BUILDINGNO = s.BUILDINGNO AND r.ROOMNO = s.ROOMNO
GROUP BY r.BUILDINGNO, r.ROOMNO
ORDER BY r.BUILDINGNO, r.ROOMNO;
您可以将ORDER BY更改为在任何这些列上进行排序,甚至可以使用ORDER BY COUNT(*)之类的内容。
另外,正如Tim Biegeleisen所提到的,使用LEFT OUTER JOIN将为您提供所有没有会话的房间记录。如果您使用INNER JOIN,那么任何没有会话的房间都不会显示。
答案 2 :(得分:1)
我不明白你要使用的逻辑,但是你得到了这个特殊错误,因为你没有在GROUP BY子句中指定所有非聚合函数字段。换句话说,尝试将其修改为:
SELECT COUNT(BUILDINGNO) * COUNT(ROOMNO), BUILDINGNO, ROOMNO
FROM ROOM
GROUP BY BUILDINGNO, ROOMNO
ORDER BY ROOMNO;