簡體   English   中英

如何在 SQL Server 中連接字符串,並按不同的列排序/排序?

[英]How to concatenate strings in SQL Server, and sort/ order by a different column?

我在 SQL Server 中看到了很多連接字符串的例子,但如果他們擔心排序,它總是由被連接的列組成。 我需要根據不同字段中的數據對值進行排序。

示例表:

ClassID | StudentName   | SortOrder
-----------------------------
A       |James          |1
A       |Janice         |3
A       |Leonard        |2
B       |Luke           |2
B       |Leia           |1
B       |Artoo          |3

我想得到的結果是:

ClassID |StudentName
--------------------------------
A       |James, Leonard, Janice
B       |Leia, Luke, Artoo

如何在 SQL Server 2016 中做到這一點? (我很期待 2017 年的 STRING_AGG,但我們還沒有……)

謝謝!

干得好:

SELECT
     s1.ClassID
   , STUFF((SELECT
                  ',' + s2.StudentName
            FROM  dbo.Student AS s2
            WHERE s1.classID = s2.ClassID
            ORDER BY s2.SortOrder
           FOR XML PATH('')), 1, 1, '') AS StudentNames
FROM dbo.Student AS s1
GROUP BY s1.ClassID

這里查詢

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp;

CREATE TABLE #Temp(ClassId varchar(10),studName varchar(100),SortOrder int)

INSERT INTO #Temp(ClassId , studName, SortOrder)
SELECT 'A','James',1 UNION ALL
SELECT 'A','Janice',3UNION ALL
SELECT 'A','Leonard',2 UNION ALL
SELECT 'B','Luke',2 UNION ALL
SELECT 'B','Leia',1 UNION ALL
SELECT 'B','Artoo',3 


-- select * from #Temp

select
   distinct  
    stuff((
        select ',' + u.studName
        from #Temp u
        where u.studName = studName and U.ClassId =  L.ClassId
        order by u.SortOrder
        for xml path('')

    ),1,1,'') as userlist,ClassId
from #Temp  L
group by ClassId

SQL小提琴

MS SQL Server 2017 架構設置

CREATE TABLE MyTable(ClassID varchar(255),StudentName varchar(255),SortOrder int)
INSERT INTO MyTable(ClassID,StudentName,SortOrder)VALUES('A','James',1),('A','Janice',3),('A','Leonard',2),
                                                        ('B','Luke',2),('B','Lela',1),('B','Artoo',3)

查詢 1

  SELECT
     t.ClassID
   , STUFF((SELECT
                  ',' + t1.StudentName
            FROM  MyTable t1
            WHERE t.classID = t1.ClassID
            ORDER BY t1.SortOrder
           FOR XML PATH('')), 1, 1, '') AS StudentNamesConcat
FROM MyTable AS t
GROUP BY t.ClassID

結果

| ClassID |   StudentNamesConcat |
|---------|----------------------|
|       A | James,Leonard,Janice |
|       B |      Lela,Luke,Artoo |

您也可以嘗試使用 PIVOT。 這將支持更舊版本的 SQL 服務器。 唯一的限制:您應該知道最大 SortOrder 值。 下面的代碼適用於任何 ClassID 的 SortOrder <=20

SELECT ClassID, ISNULL([1],'') +ISNULL(', '+[2],'')+ISNULL(', '+[3],'')+ISNULL(', '+ 
 [4],'')+ISNULL(', '+[5],'')+ISNULL(', '+[6],'')+ISNULL(', '+[7],'')+ISNULL(', '+ 
 [8],'')+ISNULL(', '+[9],'')+ISNULL(', '+[10],'')+ISNULL(', '+[11],'')+ISNULL(', '+ 
 [12],'')+ISNULL(', '+[13],'')+ISNULL(', '+[14],'')+ISNULL(', '+[15],'')+ISNULL(', '+ 
 [16],'')+ISNULL(', '+[17],'')+ISNULL(', '+[18],'')+ISNULL(', '+[19],'')+ISNULL(', '+ 
 [20],'') AS StudentName

FROM
(SELECT SortOrder,ClassID,StudentName 
FROM [Table1] A

) AS SourceTable
PIVOT
(
MAX(StudentName)
FOR SortOrder IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20])
) AS PivotTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM