Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQL: 2 Zeilen zu einer zusammenfassen

Frage Entwicklung Datenbanken

Mitglied: philbo20

philbo20 (Level 1) - Jetzt verbinden

14.08.2014, aktualisiert 15.08.2014, 8773 Aufrufe, 11 Kommentare

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
Mitglied: Gersen
14.08.2014 um 15:43 Uhr
Hallo,

denkbar vielleicht über die max-Funktion:

select name, max(berufswunsch1), max(berufswunsch2) from tabellenname where name = "xyz";
Ungetestet unter MSSQL...

Gruß,
Gersen
Bitte warten ..
Mitglied: LianenSchwinger
LÖSUNG 14.08.2014, aktualisiert 15.08.2014
Hallo Gersen,

da fehlt noch die GROUP BY Klausel.

01.
SELECT name, max(berufswunsch1), max(berufswunsch2) FROM tabellenname GROUP BY by name
G Jörg
Bitte warten ..
Mitglied: philbo20
14.08.2014 um 16:09 Uhr
Zitat von LianenSchwinger:

Hallo Gersen,

da fehlt noch die GROUP BY Klausel.

01.
> SELECT name, max(berufswunsch1), max(berufswunsch2) FROM tabellenname GROUP BY by name 
02.
> 

Hallo ihr beiden...

fast


Also, so klappt es schonmal, dass mir das Ergebnis in drei Spalten ausgegeben wird. Wenn ich allerdings ein Select name, max(berufswunsch1) + ', ' + max(berufswunsch2) versuche, um mir bei zwei Werten diese Kommagetrennt ausgeben zu lassen, dann habe ich fast überall nur NULL stehen.
In den Zeilen, wo beide Berufswünsche gefüllt waren, wird korrekt mit Komma getrennt, allerdings nicht dort, wo nur eine Spalte gefüllt und die andere NULL war.

Wieso??

Danke schonmal!
Bitte warten ..
Mitglied: LianenSchwinger
14.08.2014 um 16:33 Uhr
Hallo,

ganz einfach ein "irgendwas" + NULL = NULL

Was gefällt Dir an der 3 Spalten Lösung denn nicht?

G Jörg
Bitte warten ..
Mitglied: Biber
14.08.2014, aktualisiert 15.08.2014
Moin philbo20,

so in etwa (ungetestet):

01.
SELECT name 
02.
    ,   case when bw1 is null then '' else bw1 ||', ' end 
03.
     || case when bw2 is null then '' else bw2       end  
04.
      as bw  
05.
  FROM  (    
06.
 SELECT name, max(berufswunsch1) as bw1, max(berufswunsch2) as bw2  
07.
  FROM tabellenname GROUP BY by name  
08.
) x 
09.
;
[Edit] In ziemlich allen SQL-Dialekten werden Strings konkateniert mit " || " und Zahlen werden addiert mit "+".
Warum M$ nun die Strings mit "+"-Zeichen verkettet, ist mir unerfindlich. Wenn dir oder dem Server die " || " nicht gefallen, dann ändere die in Pluszeichen.
[/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
Bitte warten ..
Mitglied: philbo20
15.08.2014, aktualisiert um 08:11 Uhr
Danke euch!
ich habe es noch ein wenig angepasst, und hoffe nun alle eventualitäten abzufangen (beide Spalten sind nie Null, daher habe ich das nicht abgefragt).
01.
SELECT name,    
02.
CASE WHEN (bw1 IS not null and bw2 is not null) then (bw1 + ', '+ bw2)  
03.
ELSE (CASE WHEN bw1 IS not null then bw1 ELSE bw2 END) END AS 'Berufswunsch'   
04.
FROM  (    
05.
 SELECT name, max(berufswunsch1) as bw1, max(berufswunsch2) as bw2  
06.
  FROM BewProf GROUP BY name 
07.
) x 
08.
;
So funktioniert das Ganze auf jeden Fall!

Ich muss es in 1 Spalte zusammenfassen, weil ich es so für die weitere Verwendung liefern muss.
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
Bitte warten ..
Mitglied: Biber
15.08.2014, aktualisiert um 09:41 Uhr
Moin philbo,

bei deiner Strategie kannst du das Statement mit der o.a. COALESCE-Funktion noch ewas schlanker gestalten:
01.
SELECT name,    
02.
CASE WHEN (bw1 IS not null and bw2 is not null) THEN (bw1 + ', '+ bw2)  
03.
         ELSE (COALESCE(  bw1 , bw2 ) END AS 'Berufswunsch'   
04.
FROM  (    
05.
 SELECT name, max(berufswunsch1) as bw1, max(berufswunsch2) as bw2  
06.
  FROM BewProf GROUP BY name 
07.
) x 
08.
;
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
Bitte warten ..
Mitglied: Gersen
15.08.2014, aktualisiert um 10:02 Uhr
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

Dazu solltest Du Dir vielleicht mal das MERGE-Konstrukt anstelle von einfachen INSERTs anschauen.
Bitte warten ..
Mitglied: philbo20
15.08.2014 um 10:00 Uhr
Ja, wenn ich beide Statements in einer Abfrage unterbringen könnte, so dass die Ergebnisse in eine Zeile (bei gleichem Namen) geschrieben werden, wäre das natürlich Ideal...
also hier meine Abfragen:
01.
SELECT Name, MIN(tPersBewProfBkz.tPpbBkz) AS ErsterWertvontPpbBkz_baus  
02.
FROM tPersBewProf INNER JOIN tPersBewProfBkz ON tPersBewProf.tBpId = tPersBewProfBkz.tPpbBpId  
03.
WHERE (((tPersBewProf.tBpStellenTyp)='baus') AND ((tPersBewProf.tBpAktAb)<=Convert(date,GetDate())  
04.
AND ((tPersBewProf.tBpAktBis)>=Convert(date,GetDate()) Or (tPersBewProf.tBpAktBis) Is Null)  
05.
GROUP BY Name
und Abfrage 2:
01.
SELECT Name, MIN(tPersBewProfBkz.tPpbBkz) AS ErsterWertvontPpbBkz_aarb  
02.
FROM tPersBewProf INNER JOIN tPersBewProfBkz ON tPersBewProf.tBpId = tPersBewProfBkz.tPpbBpId  
03.
WHERE (((tPersBewProf.tBpStellenTyp)='aarb') AND ((tPersBewProf.tBpAktAb)<=Convert(date,GetDate())  
04.
AND ((tPersBewProf.tBpAktBis)>=Convert(date,GetDate()) Or (tPersBewProf.tBpAktBis) Is Null)  
05.
AND ((tPersBewProfBkz.tPpbPrio)=-1) AND ((tPersBewProfBkz.tPpbBkz)<>'99999999'))) 
06.
GROUP BY Name
vom Prinzip her sind beide identisch, der einzige Unterschied ist die Where-Bedingung in Bezug auf das Feld Stellentyp.
Bitte warten ..
Mitglied: Biber
LÖSUNG 15.08.2014, aktualisiert 18.08.2014
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.

01.
Select Name 
02.
     , Max(ErsterWertvontPpbBkz_baus) as ErsterWertvontPpbBkz_baus 
03.
     , Max( ErsterWertvontPpbBkz_aarb) as ErsterWertvontPpbBkz_aarb  
04.
    FROM (   
05.
SELECT Name,  
06.
   MIN(tPersBewProfBkz.tPpbBkz) AS ErsterWertvontPpbBkz_baus , '' as ErsterWertvontPpbBkz_aarb 
07.
FROM tPersBewProf  
08.
 INNER JOIN tPersBewProfBkz ON tPersBewProf.tBpId = tPersBewProfBkz.tPpbBpId  
09.
 WHERE (((tPersBewProf.tBpStellenTyp)='baus') AND ((tPersBewProf.tBpAktAb)<=Convert(date,GetDate())  
10.
 AND ((tPersBewProf.tBpAktBis)>=Convert(date,GetDate()) Or (tPersBewProf.tBpAktBis) Is Null)  
11.
GROUP BY Name 
12.
UNION ALL 
13.
SELECT Name, '' as ErsterWertvontPpbBkz_baus , MIN(tPersBewProfBkz.tPpbBkz) AS ErsterWertvontPpbBkz_aarb  
14.
FROM tPersBewProf  
15.
 INNER JOIN tPersBewProfBkz ON tPersBewProf.tBpId = tPersBewProfBkz.tPpbBpId  
16.
 WHERE (((tPersBewProf.tBpStellenTyp)='aarb') AND ((tPersBewProf.tBpAktAb)<=Convert(date,GetDate())  
17.
 AND ((tPersBewProf.tBpAktBis)>=Convert(date,GetDate()) Or (tPersBewProf.tBpAktBis) Is Null)  
18.
AND ((tPersBewProfBkz.tPpbPrio)=-1) AND ((tPersBewProfBkz.tPpbBkz)<>'99999999'))) 
19.
GROUP BY Name 
20.
) x 
21.
GROUP BY Name 
22.
;
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
Bitte warten ..
Mitglied: philbo20
18.08.2014 um 15:10 Uhr
Hi...
danke, hab es jetzt mit dem Union in der Abfrage gelöst und mache dann direkt danach ein Update, wo ich die beiden Werte dann kommagetrennt in ein drittes Feld schreiben lasse.

Gruß
Philipp
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (24)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...