Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung Datenbanken

GELÖST

SQL: 2 Zeilen zu einer zusammenfassen

Mitglied: philbo20

philbo20 (Level 1) - Jetzt verbinden

14.08.2014, aktualisiert 15.08.2014, 13582 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 ..
Ähnliche Inhalte
VB for Applications
Zeilen zusammenfassen wenn eine der Zellen gleich ist
Frage von Benni5555VB for Applications2 Kommentare

Hallo zusammen, ich suche nach einer Lösung für mein Problem und bin "fast" fündig geworden. Mein Problem sieht wie ...

VB for Applications
Mehrzeilige Datenquelle in eine Zeile Zusammenfassen
gelöst Frage von aivilonVB for Applications7 Kommentare

Guten Tag Admins Ich stehe wieder mal mit Excel an. Und zwar habe ich folgende Ausgangslage: Ausgangslage In einem ...

Datenbanken
SQL Update: Berechnen aus 2 Zeilen!
Frage von Much2kDatenbanken1 Kommentar

Hallo! Habe ein Problem wo ich keine Lösung finde. Kann man ein Script erstellen wo folgende Brechnung ausgeführt wird ...

Batch & Shell
Zeilen einer CSV zusammenfassen und zusammengefasst speichern
Frage von Experiment626Batch & Shell4 Kommentare

So würde die CSV aussehen. Ich würde gerne zusammenfassen lassen, wobei die ersten drei Token zusammengehören, das vierte Token ...

Neue Wissensbeiträge
Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 14 StundenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 14 StundenSicherheit8 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 15 StundenSicherheit9 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Sicherheit

Meltdown und Spectre: Die machen uns alle was vor

Information von Frank vor 16 StundenSicherheit12 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Heiß diskutierte Inhalte
Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von 92943Windows 1031 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
gelöst Frage von IngenieursBatch & Shell29 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
Frage von Windows10GegnerNetzwerkgrundlagen20 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...