2

我有这个数据:

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

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

如何按名称和总和(数量)进行分组,以便它忽略/吸收分组中的空或空注释并只显示 2 个组。

我想要的输出:

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

我想不通。

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

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

4 回答 4

3

只需MAX()使用comments

select id, name, sum(amount), MAX(comments) 
from table 
group by id, name;
于 2019-03-06T16:24:38.170 回答
1

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

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

在 SQL Server 版本中,可以通过以下方式生成所需的输出

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
于 2019-03-06T16:44:08.517 回答
1

利用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
于 2019-03-06T16:32:40.437 回答
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)

退货

ID  Name    Amount  Comments
1   n1      421762  Hello
2   n2      5810    Bye
于 2019-03-06T16:35:15.533 回答