sql-server - 如何在第二列的条件下聚合两列?
问题描述
初学者问题 - 不知道如何简洁地表达问题(因此为什么我未能在档案中找到类似的东西?),所以让我们举一个虚构的例子:
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] 可以采用“男性”、“女性”或“儿童”的价值观。
我想确保我不会意外地从结果中的“混合”房间中挑选客人行。
解决方案
在您所有的酒店中总共有多少个房间只供成年男性入住
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
推荐阅读
- sql - Oracle SQL 我无法分组
- python - 如何将第 i 行的 numpy 数组的单个元素与第 i 行的另一个 numpy 数组的元素相乘?
- http - 如何处理python请求中的“无法建立新连接”错误
- groovy - Groovy 闭包中的字符串引用导致的内存使用
- python - 将现有的 Shell 代码转换为 Python 以进行文件移动
- mysql - 如何创建带有可选参数的 sql 语句
- python - PyInstaller 可执行文件无法执行脚本 pyi_rth_qt5plugins
- spring - 每个角色都有自己的可访问页面
- sql-server - 将数据从 SQL Server 导入到格式化的 Excel 文件
- javascript - HTML CSS:如何使复选框仅在悬停或选中时可见