首页 > 解决方案 > 如何将 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

标签: sqlsql-server

解决方案


我不明白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

这是工作的 dbfiddle

希望这可以帮助。谢谢!


推荐阅读