Pri*_*ton 36 t-sql sql-server sql-server-2008
我有以下代码,它将为我的结果创建一个逗号分隔列表:
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr
Run Code Online (Sandbox Code Playgroud)
问题在于它创建了一个大量逗号分隔的行.我需要它每行返回一个逗号分隔的列表.
所以,如果Simon
已经成为2个机构的一部分,那么我希望:
"INSTITUTION1, INSTITUTION2"
Run Code Online (Sandbox Code Playgroud)
由于我没有提供where子句,我希望我的结果对于数据库中的每一行都显示如下.
Nit*_*esh 77
使用FOR XML PATH('')
和 STUFF()如下所示为您提供相同的逗号分隔结果
SELECT STUFF((SELECT ',' + INSTITUTIONNAME
FROM EDUCATION EE
WHERE EE.STUDENTNUMBER=E.STUDENTNUMBER
ORDER BY sortOrder
FOR XML PATH('')), 1, 1, '') AS listStr
FROM EDUCATION E
GROUP BY E.STUDENTNUMBER
Run Code Online (Sandbox Code Playgroud)
这是FIDDLE
Sim*_*ver 25
对于Sql Server 2017及更高版本,您可以使用新STRING_AGG
功能
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql
以下示例使用"N/A"替换空值,并在单个结果单元格中返回以逗号分隔的名称.
Run Code Online (Sandbox Code Playgroud)SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv FROM Person.Person;
这是结果集.
Run Code Online (Sandbox Code Playgroud)John,N/A,Mike,Peter,N/A,N/A,Alice,Bob
也许更常见的用例是将组合在一起然后聚合,就像你想要的那样SUM
,COUNT
或者AVG
.
SELECT a.articleId, title, STRING_AGG (tag, ',') AS tags
FROM dbo.Article AS a
LEFT JOIN dbo.ArticleTag AS t
ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;
Run Code Online (Sandbox Code Playgroud)
这适用于 sql server 2016
USE AdventureWorks
GO
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + Name
FROM Production.Product
SELECT @listStr
GO
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
108262 次 |
最近记录: |