我有一个表,其中包含发送文件的userID,发送文件的用户ID,文件名及发送日期。
http://sqlfiddle.com/#!6/855cc6
我试图获取一个语句,该语句每个文件名返回一行,其中包含记录列表(每个文件发送一个),其中包含我在行尾发送给它的人的姓名
这样的事情:
01/08/2014 | "main doc" | "Jon P, Mike S, Ron W"
04/04/2014 | "other doc" | "Jon P, Mike S"
10/10/2014 | "last doc" | "Ron W"
(其中日期是DateSent datetime字段的最旧实例)。
抱歉,我不知道如何在sqlfiddler中创建函数,所以让我们假设有一个名为" GetName(UserID)"的标量函数。返回作为参数传递的用户的名称。它只返回一行。
答案 0 :(得分:2)
您可以使用FOR XML PATH
来连接这样的值:
SELECT DISTINCT
DateSent,
FileName,
SUBSTRING
(
(
SELECT CONCAT(',', t1.SentToUserID) --maybe GetName(t1.SentToUserID)
FROM FileSent t1
WHERE t1.FileName = t2.FileName AND t1.DateSent = t2.DateSent AND t1.UserID = t2.UserID
ORDER BY t1.FileName
FOR XML PATH ('')
), 2, 1000
) [SentFiles]
FROM FileSent t2
ORDER BY DateSent
Sample SQL Fiddle(两个略有不同的版本)。
要获得可在FileName和UserId上使用MIN(DateSent)
和GROUP BY
的最短日期
SELECT DISTINCT
MIN(DateSent) DateSent,
FileName,
STUFF ((SELECT CONCAT(',', t1.SentToUserID)
FROM FileSent T1
WHERE t1.FileName = t2.FileName AND t1.UserID = t2.UserID
FOR XML PATH('')
),1,1,'' ) [SentFiles]
FROM FileSent T2
GROUP BY FileName, UserID