如何将STUFF()从三个表应用于逗号?

时间:2019-05-16 17:47:52

标签: sql sql-server

我有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

2 个答案:

答案 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

Here is the working dbfiddle

希望,这会有所帮助。谢谢!