SQL给我发送相同文件的所有人的名字

时间:2014-09-30 00:54:14

标签: tsql sql-server-2012

我有一个表,其中包含发送文件的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)"的标量函数。返回作为参数传递的用户的名称。它只返回一行。

1 个答案:

答案 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

SQL Fiddle for this