2014-01-30 25 views
0

我具有SQL Server 2008表等列到逗号分隔值的分区由ID

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 

我需要逗号单独certificationid每雇员。例如 。对于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.but但我无法整理出来。

回答

0

你只需要雇员添加到查询以及一个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

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

是不是需要额外处理一个额外的'SELECT DISTINCT'子查询? – TTeeple

+1

实际上,在外部查询中执行'distinct'是额外的处理。这将首先生成不同的列表,然后为每个单独的员工生成子查询。把不同的外部可能会导致表中的每一行运行子查询,然后做不同。 –

+0

有道理!我评论完后检查了执行计划,现在我看到了。 http://puu.sh/6DJxk.png谢谢! – TTeeple