在列中获取CSV列表,保持列不同(SQL)

Tah*_*qui 2 sql sql-server

我需要帮助编写一个SQL查询,它可以让我得到我想要的结果.

我有一个文档上传功能,可以在多个位置为客户端上传文档.表结构简单,只有5列; FileID,FileName,Title,Description和LocationID.如果用户上传3个位置的文档,则会在此表中输入3个条目.让我们说

FileID FileName    Title      Description      LocationID
1      File1       File1      Description 1    100
2      File1       File1      Description 1    21
4      File1       File1      Description 1    181

用户上传4个位置的另一个文件,输入数据,表格现在如下所示

FileID FileName    Title      Description      LocationID
1      File1.doc   File1      Description 1    100
2      File1.doc   File1      Description 1    21
4      File1.doc   File1      Description 1    181
5      File2.pdf   File2      Description 2    123
6      File2.pdf   File2      Description 2    12
7      File2.pdf   File2      Description 2    126
8      File2.pdf   File2      Description 2    100

现在我想要的结果是

FileName    Title      Description      LocationCSV
File1.doc   File1      Description 1    100, 21, 181
File2.pdf   File2      Description 2    123, 12, 126, 100

Tar*_*ryn 5

在SQL Server中,您可以使用FOR XML PATH:

SELECT DISTINCT FileName,
  Title,
  Description,
  STUFF((SELECT ', ' + cast(LocationID as varchar(20))
         from yourtable m
         where p.FileName = m.FileName
         group by LocationID, fileid
         order by fileid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') LocationCSV
from yourtable p
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

或者使用另一个版本FOR XML PATH:

SELECT FileName,
  Title,
  Description, LEFT(LocationCSV , LEN(LocationCSV)-1) LocationCSV
FROM yourtable p
CROSS APPLY
(
    SELECT cast(LocationID as varchar(20)) + ','
    FROM yourtable m
    WHERE p.FileName = m.FileName
    FOR XML PATH('')
) m (LocationCSV)
group by FileName, Title, Description, LocationCSV
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

结果:

|  FILENAME | TITLE |   DESCRIPTION |        LOCATIONCSV |
----------------------------------------------------------
| File1.doc | File1 | Description 1 |       100, 21, 181 |
| File2.pdf | File2 | Description 2 |  123, 12, 126, 100 |
Run Code Online (Sandbox Code Playgroud)