我需要帮助编写一个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
在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)
或者使用另一个版本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)
结果:
| 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)