sql - GROUP BY并取给定值(如果它不为空)

标签 sql sql-server sql-server-2012

我有 table

+-----+-----------+-----+
| ID  | NAME      | LOC |
+-----+-----------+-----+
| 101 | Stainless | NY  |
| 101 | Brass     | MUM |
| 102 |           | NY  |
| 102 | Gold      | JP  |
| 103 | Silver    | CN  |
| 103 | Aluminium | US  |
| 104 | Platinum  | NY  |
| 104 | Diamond   | UK  |
| 105 |           | NY  |
+-----+-----------+-----+
我想group by并把NAME对应到NY的位置。如果NAMENY为空,则取另一个。如果NY对任何ID不可用,则从其他位置获取任何NAME。而且,如果某个ID仅使用空NAME出现一次,那么我们可以采用相同的值。
预期产量
+-----+-----------+
| ID  | NAME      |
+-----+-----------+
| 101 | Stainless |
| 102 | Gold      |
| 103 | Silver    |
| 104 | Platinum  |
| 105 |           |
+-----+-----------+
我已经尝试了以下查询。但这没有给出我的预期输出。我想念什么?
SELECT ID, MAX(CASE WHEN LOC='NY' AND NAME!='' THEN NAME END) NAME
FROM MYTABLE  
GROUP BY ID

最佳答案

您可以像这样使用聚合:

select id,
       coalesce( max(case when location = 'NY' then name end),
                 max(name)
               ) as desired_name
from t
group by id;
注意:这假定空白名称实际上是NULL。如果不是,则调整逻辑:
select id,
       coalesce( max(case when location = 'NY' and name <> '' then name end),
                 max(name)
               ) as desired_name
from t
group by id;

关于sql - GROUP BY并取给定值(如果它不为空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64999662/

相关文章:

mysql - 在对数据库中的可空列进行比较之前是否需要进行 NULL 值检查?

sql-server - SQL - 秒到天、小时、分钟、秒

sql - 选择使用用户登录名和密码进行查询

sql-server - 如何在 SQL Server 中使用 DACPAC 将可空列更新为不可空列

mysql - 如何为我的应用程序设置约束或限制,以便我不会删除当前正在使用的记录?

mysql - 将 mysql 查询(if 函数)转换为 db2

sql查询逻辑 - sql server 2008

mysql - 艰难的mysql查询,需要用户之间共同的词

c# - 如何在 Entity Framework 中获取 SQL Server 序列的下一个值?

sql - 选择 'EXIST' 或 'NotExist' 作为列