Reputation: 341
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
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
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
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
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