sql - 如何将 STUFF() 应用于三个表中的逗号?
问题描述
我有 3 张桌子
员工:
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
我想要像这样的输出
emp id areaid email_addr
1 1 aaaa@gmail.com,bbbb@gmail.com
2 2 bbbb@gmail.com,eeee@gmail.com
3 3 cccc@gmail.com
解决方案
我不明白emp_id
您预期输出中的列。所以,我想你想要emp_id
在同一区域下最低。另外,我猜您错误地email_addr
将预期输出的第一行列写为aaaa@gmail.com,bbbb@gmail.com
而不是aaaa@gmail.com, dddd@gmail.com
.
如果上述假设是OK,那么我认为您可以使用以下查询来实现您的预期结果。
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
希望这可以帮助。谢谢!
推荐阅读
- pandas - 数据框到字典收集特定值
- nginx - 在 URL /path/ 下运行 CKAN 的 CKAN 和 NGINX conf
- amazon-web-services - AWS ES 测试域与生产域有何不同?
- python - Pandas - 如何获取列中每个值的出现次数
- django - 是否可以在 Django 应用程序中使用离子电容器?
- c++ - 重置移动对象的常用习语是什么?
- variables - 请打开我的电脑并为我阅读您的 Windows 10 环境变量 PATH 设置
- asp.net-core - 使用 asp.net 身份完成注册的电子邮件邀请
- mysql - 如何在超过 3 个表上进行不同的连接
- swift - 使用核心数据绑定编辑 TextField 时未触发“.disabled”修饰符