sql - 分组但保留所有非 NULL 值
问题描述
假设我有桌子:
ID | Name | Intolerance
1 | Amy | Lactose
2 | Brian | Lactose
3 | Amy | Gluten
我运行这个 SQL 查询:
SELECT
Name,
CASE
WHEN Intolerance = 'Lactose' 1
END AS Lactose,
CASE
WHEN Intolerance = 'Gluten' 1
END AS Gluten
FROM
Table
我得到:
Name | Lactose | Gluten
-------+---------+--------
Amy | 1 |
Amy | | 1
Brian | 1 |
但是如果我尝试添加“GROUP BY Name”,Amy 在两列中都不会有 1,因为 GROUP BY 只选择每个 Name 的最后一行。我想得到的是:
Name | Lactose | Gluten
------+---------+---------
Amy | 1 | 1
Brian | 1 |
我怎么能得到那个?是否有一种更有效的方法来总结谁对来自相同输入的内容过敏?提前致谢。
解决方案
使用GROUP BY时,聚合函数可用于不在 GROUP BY 中的列。
在这种情况下,我假设您想使用MAX来仅获取 1 或 NULL。
SUM或 COUNT 也可用于包围CASE WHEN
.
但是那些会返回一个总数。
SELECT
Name,
MAX(CASE WHEN Intolerance = 'Lactose' THEN 1 END) AS Lactose,
MAX(CASE WHEN Intolerance = 'Gluten' THEN 1 END) AS Gluten
FROM Table
GROUP BY Name
ORDER BY Name
或者,如果您不想看到 NULL?
然后让 CASE 返回一个 varchar 而不是一个数字。
SELECT
Name,
MAX(CASE WHEN Intolerance = 'Lactose' THEN '1' ELSE '' END) AS Lactose,
MAX(CASE WHEN Intolerance = 'Gluten' THEN '1' ELSE '' END) AS Gluten
FROM Table
GROUP BY Name
ORDER BY Name
推荐阅读
- python - 在一维序列的大列表上的 Scipy 二次一维插值非常慢
- python - 如何使用 python-pptx 包自动从 Microsoft Forms 中提取信息?
- r - 在 r 中使用 left_join() 函数后值变为 NA
- fortran - 如何使用两组循环在 Fortran 中打开、读取和写入多个文件?
- javascript - 无法为范围注册 ServiceWorker ('https://.xxx.net/firebase-cloud-messaging-push-scope')
- sql-server - SQL Server - 如何在可能会回滚的运行过程中创建/提交日志记录
- python - 使用从 RoR 到 Flask 的 jwt 时出现错误“无效的加密填充”
- sql - SQL Server - 分组和求和但忽略空值或空值
- for-loop - 带有 json 子列表的 Flutter for 循环
- python - 为什么 cuDNN 不加载(GPU)?