SQL COUNT函数由2列组成

时间:2017-10-06 05:02:56

标签: sql oracle aggregate-functions

我正在计算每个房间和每个建筑物的会话数量。截至目前,我已经写了这个查询:

SELECT COUNT(BUILDINGNO)*COUNT(ROOMNO), BUILDINGNO, ROOMNO
FROM ROOM
GROUP BY BUILDINGNO
ORDER BY ROOMNO;

但是我收到一条错误消息,说它正在按表达式丢失一组。

3 个答案:

答案 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;

ROOMCONFERENCESESSION表之间进行左连接非常重要,因为可能某个房间没有任何会话。但我们仍然希望报告该房间的总数为零。

答案 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;