初学者问题-不确定如何简洁地表达问题(因此为什么我无法在档案中找到类似的内容?),让我们来看一个虚拟的例子:
1)您拥有一家连锁酒店,并希望找出您所有酒店中总共只有成年男性入住的房间数。
2)与上述相同,但是无论出于何种原因,您还希望分别找出单身男性和2+岁男性所占据的房间数。
您有一个表,其中包含以下各列:
| guest_ID | hotel_name | room_ID | gender |
因此[guest_ID]是一些ID列,其中包含每个在酒店住宿的人的唯一ID。 [hotel_name]是每个分支的名称,并且在查询中应该无关。 [room_ID]是每个分支中的房间号,但是是唯一的,因此Pink Flamingo中的房间237具有与The Stanley中的房间237不同的ID,一个int或其他内容。假设[性别]可以取值“男”,“女”或“孩子”。
我想确保我不会意外地从“混合”房间中挑选客人行。
答案 0 :(得分:1)
您的所有酒店中总共只有几间客房由成年男性占用
SELECT
COUNT(*) AS TOTAL_ROOMS
FROM
(
SELECT
room_ID
FROM
MyTable
OUTER APPLY
(
SELECT CASE WHEN gender = 'male' THEN 1 ELSE 0 END AS IS_MALE
) AS T
GROUP BY
room_ID
HAVING
SUM(T.IS_MALE)/COUNT(*) = 1
) AS ROOMS
与上面相同,但是无论出于何种原因,您都希望找出单身男性所占房间的数量
SELECT
COUNT(*) AS TOTAL_ROOMS
FROM
(
SELECT
room_ID
FROM
MyTable
OUTER APPLY
(
SELECT CASE WHEN gender = 'male' THEN 1 ELSE 0 END AS IS_MALE
) AS T
GROUP BY
room_ID
HAVING
SUM(T.IS_MALE)/COUNT(*) = 1 AND COUNT(*) = 1
) AS ROOMS
以及2位以上的男性
SELECT
COUNT(*) AS TOTAL_ROOMS
FROM
(
SELECT
room_ID
FROM
MyTable
OUTER APPLY
(
SELECT CASE WHEN gender = 'male' THEN 1 ELSE 0 END AS IS_MALE
) AS T
GROUP BY
room_ID
HAVING
SUM(T.IS_MALE)/COUNT(*) = 1 AND COUNT(*) >= 2
) AS ROOMS