SQL Server:将多行组合成一行

Son*_*nül 59 t-sql sql-server sql-server-2008

我有这样的SQL查询;

SELECT * 
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602
Run Code Online (Sandbox Code Playgroud)

这就是结果;

在此输入图像描述

我想要的是; 显示在一行(单元格)中的所有组合,STRINGVALUE并用逗号分隔.像这样;

SELECT --some process with STRINGVALUE--
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

Araç Listesi (C2, K1 vb.Belgeler; yoksa Ruhsat Fotokopileri), Min. 5
araç plakas? için ?nternet Sorgusu, Son 3 Y?la Ait Onayl? Y?l Sonu
Bilanço + Gelir Tablosu, Son Y?l (Y?l Sonuna ait) Detay Mizan?, ?çinde
Bulundu?umuz Y?la ait Ara Dönem Geçici Vergi Beyannamesi, Bayi Yorum
E-Maili, Proforma Fatura
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Cod*_*ian 79

有几种方法.

如果只想返回合并的字符串值,这是一种快速简便的方法

DECLARE @combinedString VARCHAR(MAX)
SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue
FROM jira.customfieldValue
WHERE customfield = 12534
    AND ISSUE = 19602

SELECT @combinedString as StringValue 
Run Code Online (Sandbox Code Playgroud)

哪个会返回你的组合字符串.

您也可以尝试其中一种XML方法,例如

SELECT DISTINCT Issue, Customfield, StringValues
FROM Jira.customfieldvalue v1
CROSS APPLY ( SELECT StringValues + ',' 
              FROM jira.customfieldvalue v2
              WHERE v2.Customfield = v1.Customfield 
                  AND v2.Issue = v1.issue 
              ORDER BY ID 
                  FOR XML PATH('') )  D ( StringValues )
WHERE customfield = 12534
    AND ISSUE = 19602
Run Code Online (Sandbox Code Playgroud)

  • 这里有一个非常好的教程https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/ (2认同)

Füt*_*ire 19

这是一个老问题,但随着 Microsoft SQL Server 2017 的发布,您现在可以使用该函数,该函数与 MySQL 中的函数STRING_AGG()非常相似。GROUP_CONCAT

STRING_AGG (Transact-SQL) 文档

例子

USE AdventureWorks2016
GO
SELECT STRING_AGG (CONVERT(NVARCHAR(max),FirstName), ',') AS csv 
FROM Person.Person; 
Run Code Online (Sandbox Code Playgroud)

退货

Syed,Catherine,Kim,Kim,Kim,Hazem
Run Code Online (Sandbox Code Playgroud)


Kar*_*n P 16

你可以实现这一点,结合For XML Path和STUFF如下:

SELECT (STUFF((
        SELECT ', ' + StringValue
        FROM Jira.customfieldvalue
        WHERE CUSTOMFIELD = 12534
        AND ISSUE = 19602
        FOR XML PATH('')
        ), 1, 2, '')
    ) AS StringValue
Run Code Online (Sandbox Code Playgroud)


Joh*_*ren 9

在MySql中有一个方便的方法叫做GROUP_CONCAT.SQL Server的等效项不存在,但您可以使用SQLCLR编写自己的SQL Server.幸运的是有人已经为你做了这件事.

然后你的查询变成了这个(btw是一个更好的语法):

SELECT CUSTOMFIELD, ISSUE, dbo.GROUP_CONCAT(STRINGVALUE)
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602
GROUP BY CUSTOMFIELD, ISSUE
Run Code Online (Sandbox Code Playgroud)

但请注意,此方法适用于组内最多100行.除此之外,您将遇到重大的性能问题.SQLCLR聚合必须序列化任何中间结果,并且很快就会积累大量工作.牢记这一点!

有趣的是,FOR XML它不会遇到同样的问题,而是使用那种可怕的语法.