2

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

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

FileID 文件名 标题 描述 LocationID
1 文件 1 文件 1 说明 1 100
2 文件 1 文件 1 说明 1 21
4 文件 1 文件 1 说明 1 181

用户为 4 个位置上传另一个文件,数据被输入,表格现在看起来像这样

FileID 文件名 标题 描述 LocationID
1 File1.doc 文件 1 说明 1 100
2 文件 1.doc 文件 1 说明 1 21
4 文件 1.doc 文件 1 说明 1 181
5 文件 2.pdf 文件 2 说明 2 123
6 文件 2.pdf 文件 2 说明 2 12
7 文件 2.pdf 文件 2 说明 2 126
8 文件 2.pdf 文件 2 说明 2 100

现在我想要的结果是

文件名 标题 描述 LocationCSV
File1.doc 文件 1 说明 1 100、21、181
File2.pdf 文件 2 说明 2 123、12、126、100
4

3 回答 3

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

请参阅带有演示的 SQL Fiddle

或使用另一个版本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

请参阅带有演示的 SQL Fiddle

结果:

|  FILENAME | TITLE |   DESCRIPTION |        LOCATIONCSV |
----------------------------------------------------------
| File1.doc | File1 | Description 1 |       100, 21, 181 |
| File2.pdf | File2 | Description 2 |  123, 12, 126, 100 |
于 2012-12-14T11:35:07.650 回答
3

在 MySQL 中,您可以使用GROUP_CONCAT

select FileName,
       Title,
       Description, 
       group_concat(LocationID) as  LocationCSV 
from t group by FileName,Title,Description
于 2012-12-14T11:25:45.933 回答
0

看看 Bradc 的回答。我喜欢这种连接列的方法。

在 Microsoft SQL Server 2005 中模拟 group_concat MySQL 函数?

于 2012-12-14T11:39:17.817 回答