Suyash
Suyash

Reputation: 341

How to retrieve multiple records of a particular id in one row using SQL Server

I have 3 tables as follows

Issues

issue_num     issue_desc       issue_status   issue_date
-----------------------------------------------------------------------
abc123        login issue           1           2017-03-15 00:00:00.000
abc345        session issue         1           2017-03-15 00:00:00.000
abc334        logeger issue         1           2017-03-15 00:00:00.000

Users

id      user_id     user_first_name     user_last_name      user_email_id
--------------------------------------------------------------------------    
1       yash123         yashn               ray             [email protected]  
2       ray234          raah                kumar           [email protected]
3       aniket          aniket              pal             [email protected]

Issue Assigned

issue_num      assigned_to_user_id      comment                 assign_date
------------------------------------------------------------------------------------
abc123              1                   replicating issue       2017-03-15 00:00:00.000
abc123              2                   replicating issue       2017-03-15 00:00:00.000
abc345              2                   replicating issue       2017-03-15 00:00:00.000
abc345              3                   replicating issue       2017-03-15 00:00:00.000
abc334              3                   replicating issue       2017-03-15 00:00:00.000

If you check in Issue_Assigned table, some issues are assigned to 2 users. I want to write a query where in my expected result should be following

Issue_number     issue_desc        assigned_to_user_id              comment          assign_date
---------------------------------------------------------------------------------------------------------    
abc123          login issue         yash123,ray234              replicating issue   2017-03-15 00:00:00.000
abc345          session issue       ray234,aniket               replicating issue   2017-03-15 00:00:00.000
abc334          session issue       aniket                      replicating issue   2017-03-15 00:00:00.000

Upvotes: 1

Views: 266

Answers (4)

Vecchiasignora
Vecchiasignora

Reputation: 1315

Try it, it should be ok

select i.issue_num, i.issue_desc, iss.* from Issues i join 
(select distinct a.issue_num, a.comment, a.assign_date, STUFF((
                Select u.user_id + ',' AS assigner_to_user_id
                From Issue_Assigned isu join Users u on isu.assigned_to_user_id = u.id
                Where isu.issue_num = a.issue_num
                ORDER BY u.id
                For XML PATH (''), type).value('.','nvarchar(max)'
            )  ,1,1, '') as assigned_to_user_id
            from Issue_Assigned a ) iss on i.issue_num = iss.issue_num

Upvotes: 1

SqlZim
SqlZim

Reputation: 38023

using the stuff() with select ... for xml path ('') method of string concatenation.

select 
    issue_num
  , issue_desc
  , assigned_to_user_id = stuff((
    select distinct ','+u.user_id
    from Users u 
      inner join IssueAssigned sia
        on u.id = sia.assigned_to_user_id
    where sia.issue_num = i.issue_num
    for xml path (''), type).value('.','nvarchar(max)')
    ,1,1,'')
  , x.comment 
  , x.assign_date
from Issues i
  cross apply (
    select top 1 ia.comment, ia.assign_date
    from IssueAssigned ia
    where ia.issue_num = i.issue_num
    ) as x

rextester demo: http://rextester.com/QFVR26057

returns:

+-----------+---------------+---------------------+-------------------+---------------------+
| issue_num |  issue_desc   | assigned_to_user_id |      comment      |     assign_date     |
+-----------+---------------+---------------------+-------------------+---------------------+
| abc123    | login issue   | ray234,yash123      | replicating issue | 2017-03-15 00:00:00 |
| abc345    | session issue | aniket,ray234       | replicating issue | 2017-03-15 00:00:00 |
| abc334    | logeger issue | aniket              | replicating issue | 2017-03-15 00:00:00 |
+-----------+---------------+---------------------+-------------------+---------------------+

Credit to Gouri Shankar Aechoor for composing the sample data.

Upvotes: 2

Gouri Shankar Aechoor
Gouri Shankar Aechoor

Reputation: 1581

Hope this helps

;WITH cte_Issues(issue_num,issue_desc,issue_status,issue_date) AS
(
SELECT 'abc123','login issue','1','2017-03-15 00:00:00.000' UNION ALL
SELECT 'abc345','session issue','1','2017-03-15 00:00:00.000' UNION ALL
SELECT 'abc334','logeger issue','1','2017-03-15 00:00:00.000'
)
,cte_users(id,user_id,user_first_name,user_last_name,user_email_id) AS
(
SELECT 1,'yash123','yashn','ray','[email protected]' UNION ALL
SELECT 2,'ray234','raah','kumar','[email protected]' UNION ALL
SELECT 3,'aniket','aniket','pal','[email protected]'
)
,cte_IssueAssigned (issue_num,assigned_to_user_id,comment,assign_date) AS
(
SELECT 'abc123',1,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc123',2,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc345',2,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc345',3,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc334',3,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE)
)
,
cte_Staging AS (
        SELECT ci.issue_num,
            issue_desc,
            user_id AS assigned_to_user_id,
            comment,
            issue_date
        FROM cte_Issues ci
        INNER JOIN cte_IssueAssigned cia
            ON ci.issue_num = cia.issue_num
        INNER JOIN cte_users cu
            ON cu.id = cia.assigned_to_user_id
        )

SELECT issue_num,
    issue_desc,
    STUFF((
            SELECT ',' + b.assigned_to_user_id AS [text()]
            FROM cte_Staging b
            WHERE b.issue_num = a.issue_num
            FOR XML PATH('')
            ), 1, 1, '') AS assigned_to_user_id,
    comment,
    issue_date
FROM cte_Staging a

Upvotes: 1

Rajesh Bhat
Rajesh Bhat

Reputation: 811

This should give the desired result.

select T2.issue_num, issue_desc, stuff((select ',' + cast(user_id  as varchar(20))
                          from Users T1
                          where T1.id=T2.assigned_to_user_id
                          for xml path('')),1,1,'') userid,T2.comment,T2.assign_date
from IssueAssigned T2 inner join issues T3 on T2.issue_num=T3.issue_num

Upvotes: 0

Related Questions