5

che sto unire più tabelle in cui voglio un valore di colonna in riga secondo TechnicianName:Come utilizzare GROUP BY per concatenare stringhe mentre si uniscono a più tabelle?

  • Ho 4 tabelle easy_tbljobcard, easy_tbltechnician e easy_tblproblem e easy_tbltechnicianMaster

  • sto ottenendo TechnicianName nel 2 ° colonna da easy_tbltechnicianMaster dove technicianId esiste in easy_tbltechnician

  • Voglio STUFF a 3 ° colonna nella mia interrogazione (p.ProblemReported)

istruzione SQL corrente: risultato

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 

Query:

╔══════════╦══════════════════╦═══════════════════╗ 
║ 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  ║ 
╚══════════╩══════════════════╩═══════════════════╝ 

Il risultato di cui sopra dovrebbe essere convertito in questo:

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

Come fare questo mentre si collegano più tabelle?

SQLFiddle

+0

possibile duplicato di [Come utilizzare GROUP BY per concatenare le stringhe in SQL Server?] (Http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate -strings-in-sql-server) –

+0

@ Clockwork-Muse penso che non sia duplicato .. puoi fornirmi un esempio in cui puoi raggruppare colonne in una riga con separatore Specialmente durante la partecipazione a più tabelle come ho detto mentre unendo più tabelle –

risposta

11

È possibile specificare un CTE – common table expression per memorizzare il risultato temporaneo:

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) 

E poi select da esso e concatenare tutti i valori di colonna con la stessa t.techName e t.CardID in una fila con for xml path('') e dopo che sostituisce la prima virgola , con 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

+0

ho bisogno di questo mentre unisco più tabelle, come fare che –

+0

@Siddiq Baig: La tua domanda è troppo ampia.Aggiorna la tua risposta con la tua query complessa, ad esempio, specifica, dove hai bisogno di query con 'STUFF' e presto. – potashin

+0

ho aggiornato la mia domanda –