Как я могу применить STUFF () к запятой из трех таблиц? - PullRequest
0 голосов
/ 16 мая 2019

у меня 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

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Я не понимаю столбец emp_id в ожидаемом выводе. Итак, я полагаю, вы хотите самый низкий emp_id в той же области. Кроме того, я предполагаю, что вы по ошибке записали 1-ю строку столбца 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

Вот рабочий dbfiddle

Надеюсь, это поможет. Спасибо!

1 голос
/ 16 мая 2019

Внешний запрос и группировка по должны включать только 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...