SQL 服务器分组吸收 null 和空值

SQL Server group by absorb null and empty values

我有这个数据:

Id  Name     amount    Comments 
-------------------------------
1     n1     421762    Hello    
2     n2        421    Bye      
3     n2        262    null     
4     n2       5127    ''  

每个名称可能有也可能没有带有空注释或空注释的额外行。

如何按名称和总和(数量)进行分组,以便 ignores/absorbs 分组中的空评论或空评论只显示 2 个组。

我想要的输出:

Id   Name     sum(amount)   Comments 
------------------------------------
1     n1         421762     Hello    
2     n2           5180     Bye 

我想不通。

我希望这会忽略 null/empty 值,但我总是以 4 组结束

select id, name, sum(amount), comments 
from table 
group by id, name, comments

只需将 MAX()comments 一起使用:

select id, name, sum(amount), MAX(comments) 
from table 
group by id, name;

使用row_number()

  select id,name,comments,amount from 
     (select id,name,
     row_number() over(partition by Name  order by  case when Comments is not null then 1 else 2 end) rn,
       sum(amount) over(partition by Name) as amount,comments
   from table_name
      ) a where a.rn=1
Select Top 1 with Ties
       ID 
      ,Name
      ,Amount = sum(Amount) over (Partition By Name)
      ,Comments = max(Comments) over (Partition By Name)
from YourTable
Order by Row_Number() over (Partition By Name Order by ID)

Returns

ID  Name    Amount  Comments
1   n1      421762  Hello
2   n2      5810    Bye

您不能在 SELECT 语句中包含字段,除非它是 GROUP BY 子句的一部分或用于聚合。问题和所需的输出显示行应按名称分组,这意味着应聚合所有其他字段(ID、数量、评论)。

问题没有指定如何 ID 应该聚合,或者应该显示哪些评论。在 2016 年之前的所有 SQL 服务器版本中,只能使用 MIN/MAX 等函数来聚合字符串。SQL Server 2017 添加了 STRING_AGG 来连接字符串。在早期版本中,人们必须使用可能涉及 XML 或 SQLCLR 函数的许多字符串聚合技术中的一种。

在 SQL 服务器版本中,所需的输出可以由

生成
SELECT MIN(ID) as ID,name,sum(amount) as Amount, max(comment) as comments
from #table1 
group by name

这会产生所需的输出:

ID  name    Amount  comments
1   n1      421762  Hello
2   n2      5810    Bye

这假设只有一个非空评论。这个问题没有指定不同的东西。

在 SQL Server 2017 中,多个评论可以与 STRING_AGG 连接:

SELECT MIN(ID) as ID,name,sum(amount) as Amount, STRING_AGG(comment,' ') as comments
from table1 
group by name

给定问题的数据,这也将产生所需的输出。

ID  name    Amount  comments
1   n1      421762  Hello
2   n2      5810    Bye