简体   繁体   中英

How to get Email ID(one value) for each ID for 1st table and then display Email Name from 2nd table as comma Separated in SQL Server 2012?

What i have tried Results wanted like this From One table , for each ID there can be multiple email id's based on some condition Ex

ID  EmailID's
1    Mike.Foster@Mail.com
1    lilly.Foster@Mail.com
2    Michel.Josh@Mail.com
2    Nash.Ted@Mail.com

I have to get email Name from these Ids from another table, something like this

Output i Need

Email_Name
Foster.Mike,Foster.Lilly
Josh.Michel,Ted.Nash

This is what i tried.

  SELECT  User_Email = 
    STUFF((SELECT DISTINCT ', ' + User_Email
           FROM table1 b 
           WHERE b.Component_ID= a.Component_ID
           and [Role] ='Team Lead' and Functional_Group ='Product'
          FOR XML PATH('')), 1, 2, '')
FROM [WFS].table1 a
GROUP BY table1

Now another table i want Email Names

 Select EmailNamefrom Table2 where EmailIDs IN ( 'code for Email')

Table1 schema

ID Component_ID EmailIDs               Role        Functional_Group 
1    1          Mike.Foster@Mail.com   Team Lead    Product
2    1          lilly.Foster@Mail.com  Team Lead    Product
3    2          Michel.Josh@Mail.com   Team Lead    Product
4    2          Nash.Ted@Mail.com      Team Lead    Product

Table 2 schema

ID  EmailIDs                EmailName
 1   Mike.Foster@Mail.com  Foster.Mike
 2   lilly.Foster@Mail.com Foster.Lilly

Any suggestions are welcome.Thanks in advance

You were actually close but your SQL doesn't match your schema. This one works as you want:

SELECT  Email_Name = 
    STUFF((SELECT DISTINCT ', ' + EmailIDs
           FROM table1 b 
           WHERE b.Component_ID= a.Component_ID
           and [Role] ='Team Lead' and Functional_Group ='Product'
          FOR XML PATH('')), 1, 2, '')
FROM table1 a
GROUP BY a.Component_ID;

EDIT: I didn't understand what you are asking exactly. Might this be what you meant?

SELECT STUFF((SELECT ', ' + EmailName
FROM Table2 where EmailIDs IN ( SELECT EmailIDs
           FROM table1 
           WHERE [Role] ='Team Lead' and Functional_Group ='Product')
           FOR XML PATH('')), 1, 2, '')

Or you meant this:

SELECT DISTINCT Component_ID, emailNames
FROM table1
CROSS APPLY (SELECT STUFF((SELECT ', '+t2.EmailName
           FROM table2 t2
           INNER JOIN TABLE1 t1 ON t1.EmailIDs = t2.EmailIDs
           WHERE t1.Component_ID = Table1.Component_ID
           FOR XML PATH('')), 1, 2, '')
 ) t(EmailNames)
WHERE [Role] ='Team Lead' and Functional_Group ='Product'

Here is SQLFiddle Demo

Disregard this answer as I found out that GROUP_CONCAT() is a MySQL specific function , which means it won't work in SQL Server, however, I'll let it stay for future references.

SELECT
  GROUP_CONCAT(EmailName SEPARATOR ', ') as name
FROM
  table1
INNER JOIN table2 ON table1.EmailIDs=table2.EmailIDs
WHERE
  table1.EmailIDs=table2.EmailIDs
GROUP BY
  table1.Component_ID

Output:

Foster.Mike, Foster.Lilly

Ted.Nash, Josh.Michel

Working SQL fiddle

Docs: https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat

You need CTE with STUFF() :

WITH t AS (
     SELECT t1.*, t2.emailname
     FROM table1 t1 INNER JOIN
          table2 t2
          ON t2.emailids = t1.emailids 
)

SELECT id, STUFF ( (SELECT DISTINCT ','+t1.emailname
                    FROM t t1
                    WHERE t1.id = t.id
                    FOR XML PATH ('')
                   ), 1, 1, ''
                 ) AS Email_Name
FROM t
GROUP BY id;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM