首页 > 解决方案 > 分组但保留所有非 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 |

我怎么能得到那个?是否有一种更有效的方法来总结谁对来自相同输入的内容过敏?提前致谢。

标签: sql

解决方案


使用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

推荐阅读