如何汇总两列,并以第二列为条件?

时间:2019-02-19 08:51:54

标签: sql-server tsql

初学者问题-不确定如何简洁地表达问题(因此为什么我无法在档案中找到类似的内容?),让我们来看一个虚拟的例子:

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或其他内容。假设[性别]可以取值“男”,“女”或“孩子”。

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

1 个答案:

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