Koaleszieren und Pivot in SQL
-
05-09-2019 - |
Frage
Ich habe Probleme, herauszufinden, wie auf einem SQL-Cord zu verschmelzen oder zu schwenken, die wie folgt aussieht:
ID VALUE GROUP
3 John 18
4 Smith 18
5 Microsoft 18
3 Randy 21
4 Davis 21
5 IBM 21
etc
und ich möchte wie diese formatiert
NEWVALUE GROUP
Smith, John (Microsft) 18
Davis, Randy (IBM) 21
Dank für Ihre Anregungen und Hilfe!
Lösung
Das ist das, was ich getan, ich hoffe, es passt für Sie
DECLARE @t table (id int, value VARCHAR(20), grupo int)
INSERT @T VALUES (3, 'John', 18)
INSERT @T VALUES (4, 'Smith', 18)
INSERT @T VALUES (5, 'Microsoft', 18)
INSERT @T VALUES (3, 'Randy', 21)
INSERT @T VALUES (4, 'Davis', 21)
INSERT @T VALUES (5, 'IBM', 21)
SELECT grupo, (SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 4) + ', ' +
(SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 3) + ' (' +
(SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 5) + ')'
FROM @t t
GROUP BY grupo
Andere Tipps
SELECT LEFT(gvalue, LEN(gvalue) - 1) AS newvalue, _group
FROM (
SELECT DISTINCT _group
FROM mytable
) qo
CROSS APPLY
(
SELECT value + ', '
FROM mytable qi
WHERE qi._group = qo._group
FOR XML PATH ('')
) gr(qvalue)
Wenn Sie immer einen Satz von drei fest codierten ID
die für jede _group
haben, können Sie einfach verwenden:
SELECT m3._group, m3.value + ', ' + m4.value + '(' + m5.value + ')' AS newvalue
FROM mytable m3
LEFT JOIN
mytable m4
ON m4._group = m3.group
LEFT JOIN
mytable m5
ON m5._group = m3.group
WHERE m3.id = 3
AND m4.id = 4
AND m5.id = 5
Was Sie brauchen Abfrage nicht geschwenkt wird, sondern eine einfache Auswahl mit der Gruppe durch und aggregierter String-Verkettung Funktion. Aber ich kann mich nicht erinnern die genaue Funktion in Tsql.
Update: Es gibt keine Verkettungsaggregatfunktion in Tsql aber da sql2005 können Sie Ihre eigene Erweiterung schreiben eine solche Funktion zu implementieren. Es gibt viele Beispiele für Google-Suche nach:. Tsql 2005 Verkettung Aggregat Beispiel
Dies ist ein wenig kitschig, aber ich denke, es sollte für einen kleinen Datensatz recht gut funktionieren. Wenn Sie eine Menge Daten haben müssen Sie einen Cursor und eine Schleife erstellen.
select max(case when ID = 4 then VALUE else null end) + ', ' +
max(case when ID = 4 then VALUE else null end) + '( ' +
max(case when ID = 5 then VALUE else null end) + ') as NEWVALUE,
[GROUP]
group by [GROUP]