如何使用SQL Server在一行中检索特定id的多条记录

如何使用SQL Server在一行中检索特定id的多条记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有三张桌子如下 问题 issue_num issue_desc issue_status issue_date ----------------------------------------------------------------------- abc123 login issue 1 2017-03-15 00:00:00.000 abc345 session issue 1

我有三张桌子如下

问题

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
使用者

分配的问题

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
如果您签入
Issue\u Assigned
表,某些问题将分配给2个用户。我想写一个查询,在我的预期结果中应该是

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
使用

rextester演示:

返回:

+-----------+---------------+---------------------+-------------------+---------------------+
| 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 |
+-----------+---------------+---------------------+-------------------+---------------------+
感谢Gouri Shankar Aechoor编写样本数据。

使用

rextester演示:

返回:

+-----------+---------------+---------------------+-------------------+---------------------+
| 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 |
+-----------+---------------+---------------------+-------------------+---------------------+

古里·尚卡尔·艾科霍撰写样本数据的功劳。

这应该会给出所需的结果

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

这应该会产生预期的结果

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

试试看,应该没问题

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

试试看,应该没问题

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
希望这有帮助

;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','yash@gmail.com' UNION ALL
SELECT 2,'ray234','raah','kumar','raah@yahoo.com' UNION ALL
SELECT 3,'aniket','aniket','pal','aniket@yahoo.com'
)
,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
希望这有帮助

;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','yash@gmail.com' UNION ALL
SELECT 2,'ray234','raah','kumar','raah@yahoo.com' UNION ALL
SELECT 3,'aniket','aniket','pal','aniket@yahoo.com'
)
,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


到目前为止你做了什么?提示:查看一些答案以创建实际的CSV列表。这是否假设如果分配了多个用户一个问题,他们将有相同的分配注释和分配日期?您可以选中accepted answer@DhruvJoshi no我刚刚编写了它例如,您到目前为止做了什么?提示:查看一些答案以创建实际的CSV列表。这是否假设如果分配了多个用户一个问题,他们将有相同的分配注释和分配日期?您可以检查accepted answer@DhruvJoshi no我刚刚编写了它,例如,此结果我分别得到2个rows@Suyash,这就是你需要的,对吗?你在你想要的输出中提到了3行。这个结果我得到了2个单独的结果rows@Suyash,这就是你需要的,对吗?您在所需输出中提到了3行。正在获取第4行中“=”的语法异常,第10行和as@Suyash更新了一个演示,我正在ms sql management studio中尝试运行相同的演示errors@Suyash很乐意帮忙!获取第4行中“=”的语法异常,第10行和as@Suyash更新了一个演示,我正在ms sql management studio中尝试运行相同的演示errors@Suyash很乐意帮忙!我将修复它,一分钟内设置syntex异常(从问题_分配a)预期为id或引用的idI已修复它,仅更改列和表名称,我已更改我的注释,请在上面查找匹配的案例,它显示了2行,并且正在删除userIdi的第一个字母表。我将修复它,一分钟设置syntex例外,从问题中(分配了a)预期为id或引用的idI已修复它,仅更改列和表的名称,我已经更改了我的注释,请在上面查找匹配的案例,它显示了2行,并且删除了userId的第一个字母