SQL: 2 Zeilen zu einer zusammenfassen
Hallo zusammen,
ich habe eine SQL-Server 2008 DB, wo ich eine Tabelle mit drei Spalten habe:
Name, Berufswunsch1, Berufswunsch2
Nun ist meistens nur eine Zeile pro Name vorhanden, es ist entweder Berufswunsch1 ODER Berufswunsch2 gefüllt.
Es gibt aber auch einige Namen, die doppelt vorkommen, in der ersten Zeile ist Berufswunsch1 gefüllt, Berufswunsch2 = NULL, in der zweiten Zeile dann Berufswunsch1 = NULL, Berufswunsch2 gefüllt.
Ich würde in einer Abfrage diese gerne in einer Zeile ausgeben lassen, wenn zwei Berufswünsche angegeben sind, dann sollen dies von einem Komma getrennt ausgegeben werden.
Hat jemand eine Idee??
Gruß
Philipp
ich habe eine SQL-Server 2008 DB, wo ich eine Tabelle mit drei Spalten habe:
Name, Berufswunsch1, Berufswunsch2
Nun ist meistens nur eine Zeile pro Name vorhanden, es ist entweder Berufswunsch1 ODER Berufswunsch2 gefüllt.
Es gibt aber auch einige Namen, die doppelt vorkommen, in der ersten Zeile ist Berufswunsch1 gefüllt, Berufswunsch2 = NULL, in der zweiten Zeile dann Berufswunsch1 = NULL, Berufswunsch2 gefüllt.
Ich würde in einer Abfrage diese gerne in einer Zeile ausgeben lassen, wenn zwei Berufswünsche angegeben sind, dann sollen dies von einem Komma getrennt ausgegeben werden.
Hat jemand eine Idee??
Gruß
Philipp
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 246504
Url: https://administrator.de/forum/sql-2-zeilen-zu-einer-zusammenfassen-246504.html
Ausgedruckt am: 12.04.2025 um 05:04 Uhr
11 Kommentare
Neuester Kommentar
Moin philbo20,
so in etwa (ungetestet):
[/Edit]
Alternativ kannst du die NULL-Werte mit COALESCE() oder ISNULL() zu Wunschwerten umwandeln.
Das Statement funktioniert aber - unabhängig von NULL-Werten- auch nur unter den von dir vorgefundenen Gegebenheiten.
Sprich - es gibt keinen Fall, in dem für einen Namen mal mehrere "berufswunsch1" oder mehrere "berufswunsch2"-Felder gefüllt sind.
Falls also irgendein Depp eingegeben hat
Name="Depp", berufswunsch1="Millionär", berufswunsch2=NULL
Name="Depp", berufswunsch1="Zwiebelschäler", berufswunsch2="Fleckentferner"
--> dann fällt durch die MAX()-Aggregatfunktion der eigentlich sicherlich präferierte Berufswunsch ganz raus aus jeglichem Resultset.
Grüße
Biber
so in etwa (ungetestet):
SELECT name
, case when bw1 is null then '' else bw1 ||', ' end
|| case when bw2 is null then '' else bw2 end
as bw
FROM (
SELECT name, max(berufswunsch1) as bw1, max(berufswunsch2) as bw2
FROM tabellenname GROUP BY by name
) x
;
Alternativ kannst du die NULL-Werte mit COALESCE() oder ISNULL() zu Wunschwerten umwandeln.
Das Statement funktioniert aber - unabhängig von NULL-Werten- auch nur unter den von dir vorgefundenen Gegebenheiten.
Sprich - es gibt keinen Fall, in dem für einen Namen mal mehrere "berufswunsch1" oder mehrere "berufswunsch2"-Felder gefüllt sind.
Falls also irgendein Depp eingegeben hat
Name="Depp", berufswunsch1="Millionär", berufswunsch2=NULL
Name="Depp", berufswunsch1="Zwiebelschäler", berufswunsch2="Fleckentferner"
--> dann fällt durch die MAX()-Aggregatfunktion der eigentlich sicherlich präferierte Berufswunsch ganz raus aus jeglichem Resultset.
Grüße
Biber
Moin philbo,
bei deiner Strategie kannst du das Statement mit der o.a. COALESCE-Funktion noch ewas schlanker gestalten:
Zu deiner neuen Frage:
Ich würde gar nicht erst zwei SQL-Statements gegen das SSIS schiessen, sondern nur eine Abfrage, die Berufswunsch1 und Berufswunsch2 holt.
Oder ist das nicht möglich mit den Abfragemöglichkeiten, die dir SSIS bietet?
Poste doch mal die beiden Statements (zumindest sinngemäß).
Grüße
Biber
bei deiner Strategie kannst du das Statement mit der o.a. COALESCE-Funktion noch ewas schlanker gestalten:
SELECT name,
CASE WHEN (bw1 IS not null and bw2 is not null) THEN (bw1 + ', '+ bw2)
ELSE (COALESCE( bw1 , bw2 ) END AS 'Berufswunsch'
FROM (
SELECT name, max(berufswunsch1) as bw1, max(berufswunsch2) as bw2
FROM BewProf GROUP BY name
) x
;
Zu deiner neuen Frage:
Ich würde gar nicht erst zwei SQL-Statements gegen das SSIS schiessen, sondern nur eine Abfrage, die Berufswunsch1 und Berufswunsch2 holt.
Oder ist das nicht möglich mit den Abfragemöglichkeiten, die dir SSIS bietet?
Poste doch mal die beiden Statements (zumindest sinngemäß).
Grüße
Biber
Zitat von @philbo20:
Eigentlich hätte ich wahrscheinlich, um es sauber zu lösen, schon eine Ebene höher ansetzen müssen. Ich lasse
mir die Werte aus einer Tabelle mittels SSIS in 2 nacheinander ausgeführten SQL-Abfragen (eine für Berufswunsch 1, eine
für Berufswunsch2) in eine neue Tabelle schreiben. Allerdings müsste die zweite Abfrage ja eigentlich wenn der Name
schon vorhanden ist, nur die Spalte Berufswunsch2 füllen, anstatt eine neue Zeile anzufügen. Das hab ich aber nicht
hingekriegt...
also falls jemand weiß, wie ich das löse
Eigentlich hätte ich wahrscheinlich, um es sauber zu lösen, schon eine Ebene höher ansetzen müssen. Ich lasse
mir die Werte aus einer Tabelle mittels SSIS in 2 nacheinander ausgeführten SQL-Abfragen (eine für Berufswunsch 1, eine
für Berufswunsch2) in eine neue Tabelle schreiben. Allerdings müsste die zweite Abfrage ja eigentlich wenn der Name
schon vorhanden ist, nur die Spalte Berufswunsch2 füllen, anstatt eine neue Zeile anzufügen. Das hab ich aber nicht
hingekriegt...
also falls jemand weiß, wie ich das löse
Dazu solltest Du Dir vielleicht mal das MERGE-Konstrukt anstelle von einfachen INSERTs anschauen.
Moin philbo20,
dann würde ich einfach die beiden Statements in einem UNION ALL zusammenfassen (jeweils mit einem Dummywert für das nicht abgefragte Feld), danch nachmal aggregieren und fertsch.
Ich habe jetzt inhaltlich nicht weiter draufgeschaut, ob sich das evtl ohne UNION und mit einem Zugriff auf die tPersBewProf-Tabelle lösen liesse mit einer WHERE ( (.....baus-Bedingung) OR (aarb-Bedingung) ).
Kannst ja erstmal probieren, ob dieses Statement in endlicher Zeit fertig wird..
Grüße
Biber
dann würde ich einfach die beiden Statements in einem UNION ALL zusammenfassen (jeweils mit einem Dummywert für das nicht abgefragte Feld), danch nachmal aggregieren und fertsch.
Select Name
, Max(ErsterWertvontPpbBkz_baus) as ErsterWertvontPpbBkz_baus
, Max( ErsterWertvontPpbBkz_aarb) as ErsterWertvontPpbBkz_aarb
FROM (
SELECT Name,
MIN(tPersBewProfBkz.tPpbBkz) AS ErsterWertvontPpbBkz_baus , '' as ErsterWertvontPpbBkz_aarb
FROM tPersBewProf
INNER JOIN tPersBewProfBkz ON tPersBewProf.tBpId = tPersBewProfBkz.tPpbBpId
WHERE (((tPersBewProf.tBpStellenTyp)='baus') AND ((tPersBewProf.tBpAktAb)<=Convert(date,GetDate())
AND ((tPersBewProf.tBpAktBis)>=Convert(date,GetDate()) Or (tPersBewProf.tBpAktBis) Is Null)
GROUP BY Name
UNION ALL
SELECT Name, '' as ErsterWertvontPpbBkz_baus , MIN(tPersBewProfBkz.tPpbBkz) AS ErsterWertvontPpbBkz_aarb
FROM tPersBewProf
INNER JOIN tPersBewProfBkz ON tPersBewProf.tBpId = tPersBewProfBkz.tPpbBpId
WHERE (((tPersBewProf.tBpStellenTyp)='aarb') AND ((tPersBewProf.tBpAktAb)<=Convert(date,GetDate())
AND ((tPersBewProf.tBpAktBis)>=Convert(date,GetDate()) Or (tPersBewProf.tBpAktBis) Is Null)
AND ((tPersBewProfBkz.tPpbPrio)=-1) AND ((tPersBewProfBkz.tPpbBkz)<>'99999999')))
GROUP BY Name
) x
GROUP BY Name
;
Ich habe jetzt inhaltlich nicht weiter draufgeschaut, ob sich das evtl ohne UNION und mit einem Zugriff auf die tPersBewProf-Tabelle lösen liesse mit einer WHERE ( (.....baus-Bedingung) OR (aarb-Bedingung) ).
Kannst ja erstmal probieren, ob dieses Statement in endlicher Zeit fertig wird..
Grüße
Biber