列到逗号分隔值的ID分区

时间:2014-01-30 14:10:33

标签: sql-server sql-server-2008 query-optimization

我在sql server 2008上就像

一样
 EmployeeCertificationHistoryId EmployeeCertificationID EmployeeID  CertificationID CertificationDate
1   244 2192    1   2/15/2006
2   185 2058    87  4/10/2010
3   245 2240    102 8/11/2013
4   246 2249    104 11/23/2005
5   247 2221    101 6/12/2013
6   248 2238    84  NULL
7   245 2240    102 8/11/2013
8   249 2240    102 8/4/2013
10  253 2175    84  6/19/2013
11  254 2239    105 2/5/2011
12  255 2239    111 11/22/2012
9   96  1468    92  12/6/2010
13  256 2239    110 11/22/2012

我需要为每个employeeid使用逗号分隔certid。 例如。对于2239 => 105,111,110

我已经编写了一个查询,但它在一列中提供了所有证书ID。我的查询是

SELECT STUFF(
(SELECT ',' + CAST(C.CertificationID AS VARCHAR(100))
FROM tbl_PM_EmployeeCertificationMatrixHistory C
ORDER BY c.CertificationID
FOR XML PATH('')),1,1,'') AS CSV
GO

我只需要employeeid和certificationid。但是我无法解决它。

2 个答案:

答案 0 :(得分:1)

您需要相关子查询和员工列表。以下内容从同一个表中获取员工列表,但您可能有另一个包含此信息的表:

SELECT e.EmployeeID,
       STUFF((SELECT ',' + CAST(C.CertificationID AS VARCHAR(100))
              FROM tbl_PM_EmployeeCertificationMatrixHistory C
              where c.EmployeeID = e.EmployeeID
              ORDER BY c.CertificationID
              FOR XML PATH('')
             ),1, 1,'') AS CSV
from (select distinct EmployeeID
      from tbl_PM_EmployeeCertificationMatrixHistory
     ) e;

答案 1 :(得分:0)

您只需要在查询中添加EmployeeID以及WHEREDISTINCT

SELECT DISTINCT A.EmployeeID, STUFF(
(SELECT ',' + CAST(C.CertificationID AS VARCHAR(100))
FROM tbl_PM_EmployeeCertificationMatrixHistory C
WHERE C.EmployeeID = A.EmployeeID
ORDER BY c.CertificationID
FOR XML PATH('')),1,1,'') AS CSV
FROM tbl_PM_EmployeeCertificationMatrixHistory A
GO

如果您只想在CSV列表中返回DISTINCT个值,请在GROUP BY c.CertificationID

上方添加ORDER BY