2012-12-14 71 views
2

我需要幫助編寫一個SQL查詢,它可以根據需要爲我提供結果。在列中獲取CSV列表,保持列不同(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 
+1

您使用的是什麼RDBMS? – valex

+0

你試過搜索嗎? –

+0

當然,我搜查了很多。嘗試使用COALESCE,但沒有幫助。 –

回答

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 

使用FOR XML PATH另一個版本見SQL Fiddle with Demo

或者:

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 

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 | 
+0

PERFECTO!最好的答案。謝啦! –

3

在MySQL中你可以使用GROUP_CONCAT

select FileName, 
     Title, 
     Description, 
     group_concat(LocationID) as LocationCSV 
from t group by FileName,Title,Description 
+0

+1不知道有關'group_concat'。謝謝。我將不得不檢查SQL Server是否有這樣的東西。 – jimhark