MSSQL View Daten zusammenführen wenn X Gleich
Hallo zusammen,
ich habe eine View die sieht so aus:
Das klappt alles wunderbar. Nun möchte ich aber das der MCART nur einmal angezeigt wird, und das alle WID, Kurz und Lang einfach mit "," getrennt hintereinander steht.
Zur zeit sieht es so aus:
Mcart WID Kurz Lang
1119011-00 35 Kunstpflanze Kunstpflanze
1119011-00 36 Blume Blume
würde das aber gerne so haben:
Mcart WID Kurz Lang
1119011-00 35,36 Kunstpflanze, Blume Kunstpflanze, Blume
Wie kann ich das realisieren? Vielen dank
ich habe eine View die sieht so aus:
SELECT
f030.mcart,
swkobj.wid,
swktxt.kurz,
swktxt.lang
FROM
dbo.swkobj
LEFT JOIN dbo.swktxt ON swkobj.wid = swktxt.wid
LEFT JOIN dbo.f030 ON swkobj.refkey = f030.key_1
WHERE
swktxt.spr = 'ger'
AND swkobj.wid NOT IN (41,119,120,122,124,125,127,130,131,132,133,134,135,136,137,138,140,141,142,143,144,145,147,148,150,151,152,153,154,157,158,159,162,163,164,165,166,187,188,189,191,192,193,194,195,196,197,202,203,204,205,206,207,208,209,214,215,219,220,235,243,244,121,242)
Das klappt alles wunderbar. Nun möchte ich aber das der MCART nur einmal angezeigt wird, und das alle WID, Kurz und Lang einfach mit "," getrennt hintereinander steht.
Zur zeit sieht es so aus:
Mcart WID Kurz Lang
1119011-00 35 Kunstpflanze Kunstpflanze
1119011-00 36 Blume Blume
würde das aber gerne so haben:
Mcart WID Kurz Lang
1119011-00 35,36 Kunstpflanze, Blume Kunstpflanze, Blume
Wie kann ich das realisieren? Vielen dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1592169766
Url: https://administrator.de/contentid/1592169766
Ausgedruckt am: 21.11.2024 um 19:11 Uhr
12 Kommentare
Neuester Kommentar
EIn GROUP BY und Mergen der Werte mittels Aggregatfunktion sollte dir helfen, etwa so
https://www.w3schools.com/sql/sql_groupby.asp
https://www.sqlservertutorial.net/sql-server-string-functions/sql-server ...
SELECT
f030.mcart,
CONCAT_WS(",", swkobj.wid) as WID,
CONCAT_WS(",", swktxt.kurz) as Kurz,
CONCAT_WS(",", swktxt.lang) as Lang
FROM
dbo.swkobj
LEFT JOIN dbo.swktxt ON swkobj.wid = swktxt.wid
LEFT JOIN dbo.f030 ON swkobj.refkey = f030.key_1
WHERE
swktxt.spr = 'ger'
AND swkobj.wid NOT IN (41,119,120,122,124,125,127,130,131,132,133,134,135,136,137,138,140,141,142,143,144,145,147,148,150,151,152,153,154,157,158,159,162,163,164,165,166,187,188,189,191,192,193,194,195,196,197,202,203,204,205,206,207,208,209,214,215,219,220,235,243,244,121,242)
GROUP BY
f030.mcart;
https://www.sqlservertutorial.net/sql-server-string-functions/sql-server ...
CONCAT_WS wird nicht als Name einer integrierten Funktion erkannt.
Hast du wohl einen alten SQL Server (älter als 2017)https://docs.microsoft.com/en-us/sql/t-sql/functions/concat-ws-transact- ...
Für die siehe die Alternativen zu CONCAT_WS
STRING_AGG
https://stackoverflow.com/questions/19432370/concat-ws-for-sql-server
Klappt hier im Test aber problemlos, welche SQL Server Version nutzt du denn überhaupt ..?
Gebe ich im Group By nur die f030.mcart an, möchte er das ich die anderen auch noch einfüge, wenn ich allerdings alle mit angebe Gruppiert er diese nicht mehr
Nee, das sagt er nur weil er die Aggregations-Funktion auf deinem Server wohl nicht findet, denn alle anderen Spalten sind ja oben korrekt mit einer Aggregatsfunktion versehen, im GROUP BY muss nur die Spalte stehen nach der man gruppieren möchte.
Dann ist es klar, dort gibt es oben genutzten Aggregats-Funktionen nicht
In dem Fall siehe Workaround hier mit STUFF
Rolling up multiple rows into a single row and column for SQL Server data
Nachmachen und freuen .
In dem Fall siehe Workaround hier mit STUFF
Rolling up multiple rows into a single row and column for SQL Server data
Nachmachen und freuen .
stuff() mit FOR XML PATH ist hier zum einen die gängige Methode um in MSSQL (2016 und früher) Zeichenketten zu aggregieren und zum Anderen bietet es dir noch die Möglichkeit deine Spalten kurz und lang zu kombinieren wie du es gerne hättest. Beispiel:
WITH t AS (
SELECT
f030.mcart,
swkobj.wid,
swktxt.kurz,
swktxt.lang
FROM
dbo.swkobj
LEFT JOIN dbo.swktxt ON swkobj.wid = swktxt.wid
LEFT JOIN dbo.f030 ON swkobj.refkey = f030.key_1
WHERE
swktxt.spr = 'ger'
AND swkobj.wid NOT IN (41,119,120,122,124,125,127,130,131,132,133,134,135,136,137,138,140,141,142,143,144,145,147,148,150,151,152,153,154,157,158,159,162,163,164,165,166,187,188,189,191,192,193,194,195,196,197,202,203,204,205,206,207,208,209,214,215,219,220,235,243,244,121,242)
)
SELECT t.mcart,
t.wid,
stuff(( SELECT '; ' + ( CASE
WHEN t1.kurz != t1.lang
THEN t1.kurz + '(' + t1.lang + ')'
ELSE t1.kurz
END )
FROM t t1
WHERE t1.mcart = t.mcart
AND t1.wid = t.wid
FOR XML PATH ('')),1,1,'') AS tolles_stuff
FROM t
GROUP BY t.mcart,t.wid
Welches Format hat denn deine WID? Was soll am Ende raus kommen? Eventuell sowas hier:
Das ist aber ziemlich geraten.
WITH t AS (
SELECT
f030.mcart,
swkobj.wid,
swktxt.kurz,
swktxt.lang
FROM
dbo.swkobj
LEFT JOIN dbo.swktxt ON swkobj.wid = swktxt.wid
LEFT JOIN dbo.f030 ON swkobj.refkey = f030.key_1
WHERE
swktxt.spr = 'ger'
AND swkobj.wid NOT IN (41,119,120,122,124,125,127,130,131,132,133,134,135,136,137,138,140,141,142,143,144,145,147,148,150,151,152,153,154,157,158,159,162,163,164,165,166,187,188,189,191,192,193,194,195,196,197,202,203,204,205,206,207,208,209,214,215,219,220,235,243,244,121,242)
)
SELECT t.mcart,
t.wid,
stuff(( SELECT '; ' + cast(t1.wid AS VARCHAR(20)) + ' ' +
( CASE
WHEN t1.kurz != t1.lang
THEN t1.kurz + '(' + t1.lang + ')'
ELSE t1.kurz
END )
FROM t t1
WHERE t1.mcart = t.mcart
AND t1.wid = t.wid
FOR XML PATH ('')),1,1,'') AS tolles_stuff
FROM t
GROUP BY t.mcart,t.wid
Kein Problem manchmal gibt es Wichtigeres.
Der SQL Code ist jetzt auch nicht so komplex wenn man das mal gemacht hat. Ich kenne allerdings die Details nicht wie Datentyp der Spalten etc. Deinem letzten Satz entnehme ich das der Code zumindest ein Ergebnis liefert, ich versuche mal das richtig anzupassen:
Der SQL Code ist jetzt auch nicht so komplex wenn man das mal gemacht hat. Ich kenne allerdings die Details nicht wie Datentyp der Spalten etc. Deinem letzten Satz entnehme ich das der Code zumindest ein Ergebnis liefert, ich versuche mal das richtig anzupassen:
WITH t AS (
SELECT
f030.mcart,
swkobj.wid,
swktxt.kurz,
swktxt.lang
FROM
dbo.swkobj
LEFT JOIN dbo.swktxt ON swkobj.wid = swktxt.wid
LEFT JOIN dbo.f030 ON swkobj.refkey = f030.key_1
WHERE
swktxt.spr = 'ger'
AND swkobj.wid NOT IN (41,119,120,122,124,125,127,130,131,132,133,134,135,136,137,138,140,141,142,143,144,145,147,148,150,151,152,153,154,157,158,159,162,163,164,165,166,187,188,189,191,192,193,194,195,196,197,202,203,204,205,206,207,208,209,214,215,219,220,235,243,244,121,242)
)
SELECT t.mcart,
stuff(( SELECT '; ' + cast(t1.wid AS VARCHAR(10)) + ' ' +
( CASE
WHEN t1.kurz != t1.lang
THEN t1.kurz + '(' + t1.lang + ')'
ELSE t1.kurz
END )
FROM t t1
WHERE t1.mcart = t.mcart
FOR XML PATH ('')),1,1,'') AS tolles_stuff
FROM t
GROUP BY t.mcart