问题描述
我有一些连接在一起的用户和部门表,但前端可以选择包含多个“领导”电子邮件地址。
理想情况下,我希望将这些分开放在主数据集中;但是,在报告视图中,我希望将它们全部合并。
数据目前的样子
ID | 姓名 |
---|---|
157 | 鲍勃 |
157 | 詹姆斯 |
300 | 菲尔 |
300 | 基思 |
300 | 保罗 |
我喜欢它的样子
ID | 姓名 |
---|---|
157 | 鲍勃,詹姆斯 |
300 | 菲尔、基思、保罗 |
或者在不同的列中,以最简单的为准。
当前代码类似于以下。
Select
TU.ID,TUbyDept.FirstName,TU.LastAccessData
FROM USERDATA UD
LEFT JOIN DepartmentData DD
ON UD.DepartmentID = DD.ID
LEFT JOIN UserData UDByDept ON DD.id = UDByDept.DepartmentID
任何帮助将不胜感激,因为到目前为止我尝试过的一切都不太顺利!
使用 SSMS 2016
解决方法
如果您的 SQL Server 早于 SQL Server 2017,那么这样的事情应该可以解决问题。
WITH userlist (ID,[Name])
AS (SELECT ID,[Name] FROM YourSourceTable)
SELECT ID,STUFF((SELECT [Name] + ','
FROM userlist
WHERE ID=users.ID
FOR XML PATH('')),1,2,'')
FROM userlist users
GROUP BY ID;
我使用了通用表表达式,因为我不确定您的原始未聚合/连接源代码是什么样的。因此,基本上只需将我的代码中的“SELECT ID,[Name] FROM YourSourceTable”替换为第一个表的实际源代码(“当前数据的外观”)。
使用 SQL Server 2017 及更高版本会更轻松,因为它们带有 STRING_AGG() 函数。 More on this on MSDN.
,可能有点骇人听闻,可能仅适用于较小的数据集:
declare @x as xml=(select id,[name] from userdata for xml raw);
with distinctusers as
(
select id from userdata group by id
)
select
d.id,x.t.query('row[@id=sql:column("id")]').query('distinct-values(row/@name)')
from distincusers d
outer apply @x.nodes('.') as x(t)