我有3张桌子
员工:
getForEnv(config, 'uat').endpoint3
用户:
emp_id email_addr
1 aaaa@gmail.com
2 bbbb@gmail.com
3 cccc@gmail.com
4 dddd@gmail.com
5 eeee@gmail.com
设备:
usr_id ishod areaid emp_id
1 0 1 1
2 1 2 2
3 0 3 3
4 0 1 4
5 1 2 5
6 1 5 6
如果我有两个或两个以上员工的区域,我需要用逗号分隔电子邮件列
id areaname
1 DXB
2 MAA
3 TRV
我想要输出
SELECT u.emp_id,
stuff ((SELECT ', ' + email_addr
FROM users u
FOR XML PATH('')),1,1,'') email
FROM users u left join employee SS on u.emp_id=ss.emp_id
where u.ishod=1
GROUP BY u.emp_id,u.areaid,ss.email_addr
答案 0 :(得分:1)
外部查询和分组依据应仅包含emp id,areaid。
子查询应为单行创建串联的电子邮件。
尝试:
SELECT u.emp_id, u.areaid,
stuff ((SELECT ', ' + ss.email_addr
FROM employee SS WHERE u.emp_id=ss.emp_id
FOR XML PATH('')),1,1,'') email
FROM users u
where u.ishod=1
GROUP BY u.emp_id,u.areaid
如果您有SQL Server 2017,请使用String_agg代替Stuff。
答案 1 :(得分:1)
我不理解您期望的输出中的emp_id
列。因此,我想您想要在同一区域内最低的emp_id
。另外,我猜您错误地将预期输出的email_addr
列的第一行写为aaaa@gmail.com,bbbb@gmail.com
而不是aaaa@gmail.com, dddd@gmail.com
。
如果上述假设确定,那么我认为您可以使用以下查询来达到预期的结果。
SELECT
MIN(u.emp_id) AS emp_id,
u.areaid,
STUFF(
(
SELECT ', ' + em.email_addr
FROM employee em
INNER JOIN USERS us ON em.emp_id = us.emp_id
WHERE us.areaid = u.areaid
FOR XML PATH('')
),1,1,''
) AS email
FROM users u
GROUP BY u.areaid
但是...
由于给定表中没有emp_id
= 6的员工,您可以通过简单地按如下所示修改上面的查询来丢弃电子邮件地址为空的行
SELECT *
FROM (
SELECT
MIN(u.emp_id) AS emp_id,
u.areaid,
STUFF(
(
SELECT ', ' + em.email_addr
FROM employee em
INNER JOIN USERS us ON em.emp_id = us.emp_id
WHERE us.areaid = u.areaid
FOR XML PATH('')
),1,1,''
) AS email
FROM users u
GROUP BY u.areaid
) AS T
WHERE T.email IS NOT NULL
希望,这会有所帮助。谢谢!