Mit MS SQL Server 2005, wie ich Detail Records in eine einzige durch Kommata getrennte Liste konsolidieren

StackOverflow https://stackoverflow.com/questions/547467

  •  23-08-2019
  •  | 
  •  

Frage

HINTERGRUND: ** Ich verwende ** MS2005 . Ich habe eine Master-Tabelle (ID, mdesc) und eine DETAIL Tabelle (MID, DID, DDESC) mit Daten wie folgt

1 MASTER_1
2 MASTER_2
1 L1 DETAIL_M1_L1
1 L2 DETAIL_M1_L2
1 L3 DETAIL_M1_L3
2 L1 DETAIL_M2_L1
2 L2 DETAIL_M2_L2

Wenn ich kommen Sie mit den Tabellen mit

SELECT M.*, D.DID FROM MASTER M INNER JOIN DETAIL D on M.ID = D.MID

Ich erhalte eine Liste wie folgt aus:

1 MASTER_1 L1
1 MASTER_1 L2
1 MASTER_1 L3
2 MASTER_2 L1
2 MASTER_2 L2

FRAGE: Gibt es eine Möglichkeit, eine MS SQL-Select-Anweisung zu verwenden, um die Detaildatensätze in eine durch Kommata getrennte Liste wie folgt zu erhalten:

1 MASTER_1 "L1, L2, L3"
2 MASTER_2 "L1, L2"
War es hilfreich?

Lösung 2

Durch das Konzept in der Verbindung von Bill Karwin, es ist die CROSS APPLY , die es

macht Arbeit
SELECT ID, DES, LEFT(DIDS, LEN(DIDS)-1) AS DIDS
 FROM MASTER M1 INNER JOIN DETAIL D on M1.ID = D.MID 
  CROSS APPLY (
    SELECT DID + ', '
    FROM MASTER M2 INNER JOIN DETAIL D on M2.ID = D.MID 
    WHERE M1.ID = M2.ID
    FOR XML PATH('')
   ) pre_trimmed (DIDS)
GROUP BY ID, DES, DIDS

Ergebnisse:

ID  DES        DIDS
--- ---------- ---------------
1   MASTER_1   L1, L2, L3
2   MASTER_2   L1, L2

Andere Tipps

Sie müssen eine Funktion: -

 CREATE FUNCTION [dbo].[FN_DETAIL_LIST]
 (
     @masterid int
 )
 RETURNS varchar(8000)
 AS 
 BEGIN
     DECLARE @dids varchar(8000)

     SELECT @dids = COALESCE(@dids + ', ', '') + DID
     FROM DETAIL
     WHERE MID = @masterid
     RETURN @dids
 END

Verbrauch: -

SELECT MASTERID, [dbo].[FN_DETAIL_LIST](MASTERID) [DIDS]
FROM MASTER

coalesce ist dein Freund.

declare @CSL vachar(max)

set @CSL = NULL
select @CSL = coalesce(@CSL + ', ', '') + cast(DID as varchar(8))
from MASTER M INNER JOIN DETAIL D on M.ID = D.MID

select @CSL

Dies wird für eine generali Abfrage nicht gut funktionieren (d funktioniert gut für einen einzigen Stammsatz).

Sie können dies in einer Drop-Funktion ... aber das kann man nicht die Leistung, die Sie brauchen / wollen.

Dies ist der Zweck von MySQL GROUP_CONCAT() Aggregatfunktion. Leider ist es nicht ganz einfach, diese Funktion in anderen RDBMS Marken zu duplizieren, dass es nicht unterstützen.

Siehe Simulieren Group_concat MySQL-Funktion in Microsoft SQL Server 2005?

Ich glaube, Sie brauchen eine Funktion für dieses in der letzten Version von SQL Server ordnungsgemäß funktionieren:

http://sqljunkies.com /WebLog/amachanic/archive/2004/11/10/5065.aspx?Pending=true

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top