Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中连接字符串,并按不同列进行排序/排序?_Sql_Sql Server_Concatenation - Fatal编程技术网

如何在SQL Server中连接字符串,并按不同列进行排序/排序?

如何在SQL Server中连接字符串,并按不同列进行排序/排序?,sql,sql-server,concatenation,Sql,Sql Server,Concatenation,我在SQLServer中看到了许多连接字符串的示例,但是如果它们担心排序,那么总是根据连接的列进行。 我需要根据不同字段中的数据对值进行排序 样本表: ClassID | StudentName | SortOrder ----------------------------- A |James |1 A |Janice |3 A |Leonard |2 B |Luke |2

我在SQLServer中看到了许多连接字符串的示例,但是如果它们担心排序,那么总是根据连接的列进行。 我需要根据不同字段中的数据对值进行排序

样本表:

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

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)
  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 |
查询1

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)
  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 |

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)
  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 server。
唯一的限制:您应该知道最大排序器值。下面的代码将适用于SortOrder尝试在之前排序(考虑WITH子句),然后在SQLAggregateUse窗口函数中进行排序,但下次,请不要以图像形式提交示例数据和结果,而应以文本形式提交:)这非常有效,谢谢!(下次我一定要以文本形式提交样本数据)我编辑了问题,将内联样本而不是图像包括在内;-)