2013-07-11 18 views
69

So che in sql server non è possibile utilizzare la funzione Group_concat ma qui c'è un problema in cui ho bisogno di Group_Concat la mia query.Io google ha trovato un po 'di logica ma non in grado di corretta query SQL it.My èCome creare una query con group_concat in sql server

select m.maskid,m.maskname,m.schoolid,s.schoolname, 
md.maskdetail 
from tblmask m join school s on s.id = m.schoolid 
join maskdetails md on m.maskid = md.maskid 
order by m.maskname ; 

mi dà risultato simile

enter image description here

Basta guardare le prime 3 file In questo maskid, maskname, schoolid, SchoolName è lo stesso, ma è diverso maskdetail così vuole a uno fila per quello in cui l'ultima colonna può contenere tutti i maskdetails come per maskid e così via.

voglio che la mia uscita come

enter image description here

E così on.So ti prego, aiutami mentre si effettua una query per questo.

Grazie in anticipo.

+1

Questo non è * abbastanza * un duplicato della domanda su SQL Server 2005 dall'aggiunta di ['STRING_AGG'] (https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-trans-sql) a SQL Server 2017, quindi potrebbe essere utile esaminarlo se sei fortunato con un recente SQL Server. –

risposta

92

Query:

SELECT 
     m.maskid 
    , m.maskname 
    , m.schoolid 
    , s.schoolname 
    , maskdetail = STUFF((
      SELECT ',' + md.maskdetail 
      FROM dbo.maskdetails md 
      WHERE m.maskid = md.maskid 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM dbo.tblmask m 
JOIN dbo.school s ON s.ID = m.schoolid 
ORDER BY m.maskname 

Ulteriori informazioni:

String Aggregation in the World of SQL Server

+0

hmmm puoi spiegare @Divart intendo l'inner join dare risultato come nell'immagine ... in modo da combinare in tutti i duplicati m.maskid , m.maskname , m.schoolid , s.schoolname in una riga abbiamo bisogno di gruppo di –

+5

Relazione tra 'tblmask' -' maskdetails' = '1 a molti', quindi i duplicati dei record non dovrebbero essere qui. – Devart

+0

Qual è il motivo dell'uso di 'PATH (''), TYPE' e' .value ('.', 'NVARCHAR (MAX)') 'qui, al contrario di semplice' PATH ('') 'come in @ AmitSingh's asnwer ? La tua variante produce un modo, un piano di esecuzione più pesante, ha qualche vantaggio nascosto per giustificare il costo? In caso contrario, correggeresti o modificheresti la tua risposta dal momento che è accettata e dovrebbe essere la migliore? – pvgoran

19
Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , STUFF((
      SELECT ',' + T.maskdetail 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH('')), 1, 1, '') as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
Group by A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
+4

+1. A proposito, 'GROUP BY' non è necessario qui. – Devart

5

Si prega di eseguire la query di seguito, che non richiede roba e GROUP BY nel tuo caso :

Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , CAST((
      SELECT T.maskdetail+',' 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH(''))as varchar(max)) as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
+3

STUFF è necessario per strip della prima virgola, nel tuo caso maskdetail termina con una virgola –

6

Questo può essere ottenuto anche utilizzando il Scalar-Valued Function in MSSQL 2008
dichiarare la vostra funzione come seguendo,

CREATE FUNCTION [dbo].[FunctionName] 
(@MaskId INT) 
RETURNS Varchar(500) 
AS 
BEGIN 

    DECLARE @SchoolName varchar(500)       

    SELECT @SchoolName =ISNULL(@SchoolName ,'')+ MD.maskdetail +', ' 
    FROM maskdetails MD WITH (NOLOCK)  
    AND [email protected] 

    RETURN @SchoolName 

END 

E poi la query finale sarà come

SELECT m.maskid,m.maskname,m.schoolid,s.schoolname, 
(SELECT [dbo].[FunctionName](m.maskid)) 'maskdetail' 
FROM tblmask m JOIN school s on s.id = m.schoolid 
ORDER BY m.maskname ; 

Nota: È potrebbe essere necessario modificare la funzione, in quanto non conosco la struttura completa della tabella.

+0

Vedi anche: https://gooroo.io/GoorooTHINK/Article/10001/Aggregate-String-Concatenation-in-SQL-Server-2012- like-stringagg-in-PostgreSQL/5122 # .Wif5rLaZMWo – Magne

Problemi correlati