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
我有这个数据:
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