如何在多个表连接时使用GROUP BY来连接字符串?

6

我将连接多个表格,想要根据TechnicianName将一个列的值转为行:

  • 我有4个表:easy_tbljobcardeasy_tbltechnicianeasy_tblproblemeasy_tbltechnicianMaster

  • 我从easy_tbltechnicianMaster中获取TechnicianName(第二列),其中technicianId存在于easy_tbltechnician

  • 我想在我的查询中使用STUFF(第三列)(p.ProblemReported

当前 SQL 语句:

 SELECT j.CardID, 
      , (SELECT TechnicianName FROM easy_tbltechnicianMaster WHERE TechnicianID = t.technicianID) AS TechnicianName
      , p.ProblemReported 
 FROM easy_tbljobcard AS j 
 JOIN easy_technician AS t ON t.CardID = j.CardID  
 LEFT JOIN easy_tblproblem AS p ON p.CardID = t.CardID

查询结果:

╔══════════╦══════════════════╦═══════════════════╗
║  CardID  ║  TechnicianName  ║  ProblemReported  ║
╠══════════╬══════════════════╬═══════════════════╣
║    1     ║      AKBAR       ║     PROBLEM A     ║
║    1     ║      AKBAR       ║     PROBLEM B     ║
║    1     ║      AKBAR       ║     PROBLEM C     ║
║    1     ║      ASANKA      ║     PROBLEM A     ║
║    1     ║      ASANKA      ║     PROBLEM B     ║
║    1     ║      ASANKA      ║     PROBLEM C     ║
╚══════════╩══════════════════╩═══════════════════╝

上面的结果应转换为以下内容:
╔══════════╦══════════════════╦═════════════════════════════════╗
║  CardID  ║  TechnicianName  ║         ProblemReported         ║
╠══════════╬══════════════════╬═════════════════════════════════╣
║    1     ║      AKBAR       ║ PROBLEM A, PROBLEM B, PROBLEM C ║
║    1     ║      ASANKA      ║ PROBLEM A, PROBLEM B, PROBLEM C ║
╚══════════╩══════════════════╩═════════════════════════════════╝

如何在连接多个表的同时完成此操作? SQLFiddle

可能是如何在SQL Server中使用GROUP BY连接字符串?的重复问题。 - Clockwork-Muse
@Clockwork-Muse 我认为这不是重复的问题.. 你能否请给我一个例子,在其中您可以使用分隔符将列分组在一行中,特别是在连接多个表时,就像我所说的那样。 - Siddiq Baig
1个回答

12
你可以指定一个公共表达式(CTE)来存储你的临时结果:
with cteTbl ( CardID
            , TechName
            , problemReported ) as ( 
select j.CardID
     , p.ProblemReported
     , ( select TechnicianName
         from easy_tbltechnicianMaster
         where TechnicianID =  t.technicianID ) as TechName
from easy_tbljobcard as j 
join easy_technician as t on t.CardID = j.CardID  
left join easy_tblproblem as p  on p.CardID = t.CardID )

然后从中选择,并使用相同的 t.techName 和 t.CardID 将所有列值连接在一行中,使用 for xml path(''),然后用 stuff 替换第一个逗号 ','.
select t.CardID
     , t.TechName
     , stuff( ( select ', ' + ProblemReported
                from cteTbl
                where TechName = t.TechName
                order by ProblemReported
                for xml path('') ), 1, 1, '') AS ProblemReported
from cteTbl t
group by t.TechName
       , t.CardID

SQLFiddle


我需要在连接多个表时使用这个,如何做到? - Siddiq Baig
@Siddiq Baig:你的问题太宽泛了。请更新你的答案,加入你的复杂查询,例如,指定你需要在哪里使用STUFF函数等等。 - potashin
@Siddiq Baig: 现在对我来说很难理解问题出在哪里,因为唯一的反馈是“它不起作用”。使用我的 SQL Fiddle,在其中更新您的三个表,插入必要的数据并在此处发布。 - potashin
抱歉回复晚了。我已经在我的问题中更新了SQL Fiddle。 - Siddiq Baig
让我们在聊天中继续这个讨论 - Siddiq Baig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接