首页 > 解决方案 > 如何在第二列的条件下聚合两列?

问题描述

初学者问题 - 不知道如何简洁地表达问题(因此为什么我未能在档案中找到类似的东西?),所以让我们举一个虚构的例子:

1) 您拥有一家连锁酒店,并想了解您的所有酒店总共有多少房间仅供成年男性入住。

2) 同上,但无论出于何种原因,您还想分别找出单身男性和 2 名以上男性占用的房间数量。

您有一个表,其中包含以下列:

| guest_ID | hotel_name | room_ID | gender |

因此,[guest_ID] 是一些 ID 列,每个入住酒店的人都有一个唯一的 ID。[hotel_name] 是每个分支的名称,在查询中应该是不相关的。[room_ID] 是每个分支中的房间号,但它是唯一的,因此 The Pink Flamingo 中的房间 237 与 The Stanley 中的房间 237 具有不同的 ID,一个 int 或其他。假设 [gender] 可以采用“男性”、“女性”或“儿童”的价值观。

我想确保我不会意外地从结果中的“混合”房间中挑选客人行。

标签: sql-servertsql

解决方案


在您所有的酒店中总共有多少个房间只供成年男性入住

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

推荐阅读