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

MSSQL - Ein Feld nach Kategorie in zwei Spalten teilen

Mitglied: Yezariael

Yezariael (Level 1) - Jetzt verbinden

10.01.2012 um 16:47 Uhr, 3448 Aufrufe, 4 Kommentare

Hi zusammen,

ich habe eine SQL-Abfrage (MSSQL) geschrieben, die bis auf ein Problem auch gut läuft.
Hintergrund ist, dass ich aus unserer Kundendatenbank Institutionen und zugeordnete Personen abrufen möchte, die bestimmten Kriterien (Kategorien) entsprechen.

Hier erst mal meine Abfrage:
01.
SELECT DISTINCT i.ID_Institution AS ID_Institution, ik.ID_KategorieKontakt, kk.Bezeichnung AS Region, i.Institutionsnummer AS Einrichtungscode, 
02.
				 i.Name AS Name_Institution, i.Strasse, i.PLZ, i.Ort, ihp.ID_Person, p.Name AS Name, p.Vorname AS Vorname, php.ID_Personengruppe, 
03.
				  pg.Bezeichnung AS Personengruppe, k.Wert AS Telefon 
04.
FROM         VIEW_Institution AS i INNER JOIN 
05.
                      InstitutionHatKategorieKontakt AS ik ON i.ID_Institution = ik.ID_Institution INNER JOIN  
06.
                      KategorieKontakt as kk ON ik.ID_KategorieKontakt = kk.ID INNER JOIN  
07.
                      InstitutionHatPerson AS ihp ON i.ID_Institution = ihp.ID_Institution INNER JOIN 
08.
                      Person AS p ON ihp.ID_Person = p.ID INNER JOIN 
09.
                      PersonengruppeHatPerson AS php ON ihp.ID_Person = php.ID_Person INNER JOIN 
10.
                      Personengruppe AS pg ON pg.ID = php.ID_Personengruppe INNER JOIN 
11.
                      PersonHatKommunikationsdaten AS phk ON p.ID = phk.ID_Person INNER JOIN 
12.
                      Kommunikationsdaten AS k ON phk.ID_Kommunikationsdaten = k.ID INNER JOIN 
13.
                      KategorieKommunikation AS kkom ON k.ID_KategorieKommunikation = kkom.ID 
14.
                        
15.
WHERE    (ik.ID_KategorieKontakt = '3F7CA9B8-6E31-48B5-85B3-39161B22D8BA') AND (php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350') AND (kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2') AND phk.Standard=1 OR 
16.
		 (ik.ID_KategorieKontakt = '82E205D2-388F-4AB4-8D1D-E1A903E3ED61') AND (php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350') AND (kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2') AND phk.Standard=1 OR  
17.
		 (ik.ID_KategorieKontakt = 'C2A96AD6-0C50-4D3D-A985-F8FC24A5EBFB') AND (php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350') AND (kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2') AND phk.Standard=1 OR  
18.
		 (ik.ID_KategorieKontakt = 'D926F6BC-0DFD-43E1-B462-869A60BE7871') AND (php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350') AND (kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2') AND phk.Standard=1 
19.
ORDER BY Region
Derzeit spuckt mir die Abfrage alle gewünschten Institutionen und alle Personen ordentlich aus.
Das Problem ergibt sich bei der Tabelle Kommunikationsdaten, hier gibt es drei Spalten: ID, Wert & ID_KategorieKommunikation
Wie ihr im WHERE-Teil meiner Abfrage sehen könnt habe ich die Kategorie schon mal eingegrenzt und zwar auf Telefon, aber ich benötige auch noch Email dazu. Die ID kommt aus der der Tabelle PersonHatKommunikationsdaten, der Wert steht in der Tabelle Kommunikationsdaten selbst und die Kategorie (von denen ich eben zwei brauche) aus der Tabelle KategorieKommunikation.

Meine Frage ist also nun, wie ich meine Abfrage anpassen muss, damit ich quasi sagen kann: Gib mir den Wert der Spalte k.Wert in der Spalte Telefon aus, wenn kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2' und gib mir den Wert der Spalte k.Wert in der Spalte Email aus, wenn kkom.ID='5DBA8E8D-8BCD-44E3-9A49-A3813ECEEE03'.

Bin leider noch nicht wirklich fit in SQL und will ungern zwei getrennte Abfragen machen und die immer wieder in Excel zusammenfügen.

Ich hoffe, ich hab mein Problem halbwegs verständlich geschildert und ihr könnte mir helfen.

Danke schon mal.
Gruß
Mitglied: Biber
10.01.2012 um 22:10 Uhr
Moin Yezariael,

die Antwort ein bisschen getrennt in zwei Teilen.

Zum ersten die WHERE-Clausel... die kann ich so nicht stehen lassen.
Wenn du da draufschaust, dann stellst du fest, dass jeweils drei der vier * vier Bindungen immer gelten.

Als formuliere um in
01.
... 
02.
WHERE  
03.
-- für alle und immer gilt  
04.
      ( php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350'  
05.
          AND kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2' 
06.
           AND phk.Standard=1 ) 
07.
-- und außerdem gilt eingeleitet mit "AND". da zusätzliche Einschränkung... 
08.
AND    ik.ID_KategorieKontakt in 
09.
                          ( 'D926F6BC-0DFD-43E1-B462-869A60BE7871', 
10.
                            '3F7CA9B8-6E31-48B5-85B3-39161B22D8BA', 
11.
                            '82E205D2-388F-4AB4-8D1D-E1A903E3ED61', 
12.
                            'C2A96AD6-0C50-4D3D-A985-F8FC24A5EBFB' )
Der zweite Teil spielt sich ja nur weiter oben in der Feldliste ab
Meine Frage ist also nun, wie ich meine Abfrage anpassen muss, damit ich quasi sagen kann:
Gib mir den Wert der Spalte k.Wert in der Spalte Telefon aus, wenn kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2'
und gib mir den Wert der Spalte k.Wert in der Spalte Email aus, wenn kkom.ID='5DBA8E8D-8BCD-44E3-9A49-A3813ECEEE03'.
-> auf SQL dann übersetzt:
01.
SELECT bla, blubb, etc, 
02.
    CASE 
03.
     WHEN  kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2'  THEN k.Wert   
04.
      ELSE ' '   
05.
END as Telefon, 
06.
    CASE 
07.
     WHEN  kkom.ID='5DBA8E8D-8BCD-44E3-9A49-A3813ECEEE03'.  THEN k.Wert   
08.
      ELSE ' '   
09.
END as email, 
10.
Sülzdibülz... 
11.
FROM....
Grüße
Biber
Bitte warten ..
Mitglied: Yezariael
11.01.2012 um 09:48 Uhr
Ok, soweit klar und umgesetzt. Danke dafür schon mal!
Ein Problem stellt sich allerdings noch und zwar, dass in der WHERE-Clausel im Moment noch auf Telefon kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2' abgegrenzt wird.
Nehme ich diese Abgrenzung raus, habe ich zwar Email und Telefon, beides auch in den entsprechenden Spalten, aber jede Person doch noch in zwei Zeilen.
Was muss ich denn noch ändern, damit jede Person in nur einer Zeile dargestellt wird?

Edit:
Aktueller Stand sieht so aus, Ergebnis aber weiterhin, dass Personen mit Email und Telefon in zwei Zeilen dargestellt werden:
01.
SELECT DISTINCT i.ID_Institution AS ID_Institution, ik.ID_KategorieKontakt, kk.Bezeichnung AS Region, i.Institutionsnummer AS Einrichtungscode, 
02.
				 i.Name AS Name_Institution, i.Strasse, i.PLZ, i.Ort, ihp.ID_Person, p.Name AS Name, p.Vorname AS Vorname, php.ID_Personengruppe, 
03.
				  pg.Bezeichnung AS Personengruppe, 
04.
				  CASE WHEN  kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2' THEN k.Wert ELSE '' END as Telefon, 
05.
			      CASE WHEN  kkom.ID='5DBA8E8D-8BCD-44E3-9A49-A3813ECEEE03' THEN k.Wert ELSE '' END as email  
06.
FROM         VIEW_Institution AS i INNER JOIN 
07.
                      InstitutionHatKategorieKontakt AS ik ON i.ID_Institution = ik.ID_Institution INNER JOIN  
08.
                      KategorieKontakt as kk ON ik.ID_KategorieKontakt = kk.ID INNER JOIN  
09.
                      InstitutionHatPerson AS ihp ON i.ID_Institution = ihp.ID_Institution INNER JOIN 
10.
                      Person AS p ON ihp.ID_Person = p.ID INNER JOIN 
11.
                      PersonengruppeHatPerson AS php ON ihp.ID_Person = php.ID_Person INNER JOIN 
12.
                      Personengruppe AS pg ON pg.ID = php.ID_Personengruppe INNER JOIN 
13.
                      PersonHatKommunikationsdaten AS phk ON p.ID = phk.ID_Person INNER JOIN 
14.
                      Kommunikationsdaten AS k ON phk.ID_Kommunikationsdaten = k.ID INNER JOIN 
15.
                      KategorieKommunikation AS kkom ON k.ID_KategorieKommunikation = kkom.ID 
16.
                        
17.
WHERE   
18.
-- für alle und immer gilt   
19.
      ( php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350' AND phk.Standard=1 )  
20.
-- und außerdem gilt eingeleitet mit "AND". da zusätzliche Einschränkung...  
21.
AND    ik.ID_KategorieKontakt in ( 'D926F6BC-0DFD-43E1-B462-869A60BE7871', '3F7CA9B8-6E31-48B5-85B3-39161B22D8BA', 
22.
									'82E205D2-388F-4AB4-8D1D-E1A903E3ED61', 'C2A96AD6-0C50-4D3D-A985-F8FC24A5EBFB' ) 
23.
AND kkom.ID in ('9509F20D-1F48-4975-88C6-530B303CFDA2', '5DBA8E8D-8BCD-44E3-9A49-A3813ECEEE03') 
24.
ORDER BY Region
Bitte warten ..
Mitglied: Biber
12.01.2012 um 00:58 Uhr
Moin Yeziriael,

ein unappetitliches Datenmodell habt ihr da...

Wenn sich diese doch voraussichtlich oft benötigten Sachverhalte nur durch 17 laufende Zentimeter JOINs ermitteln lassen, dann hat es irgendein Datenbank-Praktikant offensichtlich übertrieben mit der Normalisierung.
Merke: die fünfte Normalform ist in der Praxis weder normal noch die erste Wahl.

In der Theorie, falls ihr mit dieser Datenstruktur leben müsst, dann wäre ein möglicher Weg
01.
  
02.
SELECT DISTINCT i.ID_Institution AS ID_Institution,  
03.
                ik.ID_KategorieKontakt, kk.Bezeichnung AS Region,  
04.
                i.Institutionsnummer AS Einrichtungscode, 
05.
	       i.Name AS Name_Institution, i.Strasse, i.PLZ, i.Ort,  
06.
              ihp.ID_Person, p.Name AS Name, p.Vorname AS Vorname,  
07.
                php.ID_Personengruppe,  pg.Bezeichnung AS Personengruppe, 
08.
		t.telefon, 
09.
                m.email  
10.
FROM         VIEW_Institution AS i  
11.
         INNER JOIN InstitutionHatKategorieKontakt AS ik ON i.ID_Institution = ik.ID_Institution  
12.
         INNER JOIN KategorieKontakt as kk ON ik.ID_KategorieKontakt = kk.ID  
13.
         INNER JOIN InstitutionHatPerson AS ihp ON i.ID_Institution = ihp.ID_Institution  
14.
         INNER JOIN Person AS p ON ihp.ID_Person = p.ID  
15.
         INNER JOIN PersonengruppeHatPerson AS php ON ihp.ID_Person = php.ID_Person  
16.
         INNER JOIN Personengruppe AS pg ON pg.ID = php.ID_Personengruppe  
17.
         INNER JOIN PersonHatKommunikationsdaten AS phk ON p.ID = phk.ID_Person 
18.
         INNER JOIN Kommunikationsdaten AS k ON phk.ID_Kommunikationsdaten = k.Id 
19.
       LEFT JOIN (SELECT kkom.id, kkom.Wert as Telefon  
20.
                 FROM KategorieKommunikation AS kkom  
21.
                WHERE kkom.ID='9509F20D-1F48-4975-88C6-530B303CFDA2') as t 
22.
                  ON k.ID_KategorieKommunikation = t.ID 
23.
       LEFT JOIN (SELECT kkom.id, kkom.Wert as eMail  
24.
                 FROM KategorieKommunikation AS kkom  
25.
                WHERE kkom.ID='5DBA8E8D-8BCD-44E3-9A49-A3813ECEEE03') as m 
26.
                  ON k.ID_KategorieKommunikation = m.ID 
27.
WHERE   
28.
-- für alle und immer gilt   
29.
      ( php.ID_Personengruppe='1DDC633B-D450-4E83-AEFA-C6C598B8F350' AND phk.Standard=1 )  
30.
-- und außerdem gilt eingeleitet mit "AND". da zusätzliche Einschränkung...  
31.
AND    ik.ID_KategorieKontakt in ( 'D926F6BC-0DFD-43E1-B462-869A60BE7871', 
32.
                 '3F7CA9B8-6E31-48B5-85B3-39161B22D8BA', 
33.
		'82E205D2-388F-4AB4-8D1D-E1A903E3ED61', 
34.
              'C2A96AD6-0C50-4D3D-A985-F8FC24A5EBFB' ) 
35.
ORDER BY Region
Der Vollständigkeit halber: ungetestet und irgendwie froh darüber, dass mir die Tabellen zum Testen fehlen.

Grüße
Biber
Bitte warten ..
Mitglied: Yezariael
18.01.2012 um 13:37 Uhr
Hey Biber,

klappt so leider doch noch nicht, aber ich muss die Geschichte auch erst mal auf Eis legen, da der Aufwand den Nutzen schon fast übersteigt. Hab jetzt erst mal die Daten manuell in Excel bearbeitet und aus den zwei Zeilen eine gemacht und werde mich bei Gelegenheit noch mal an das Problem setzen.
Danke dir auf jeden Fall für deine Hilfe und eventuell melde ich mich hier noch mal.

Gruß
Yeza
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Ergänzen einer CSV Datei als letze Spalte mit Teil der Dateiname

Frage von moltitiBatch & Shell11 Kommentare

ich habe ca. 12000 Dateien die im Batch Betrieb ergänzt werden sollen. Der Aufbau der Dateien ist etwa so: ...

Microsoft Office

Access 2007 suche über Dynamisches Feld in mehreren Spalten

Frage von chris78Microsoft Office2 Kommentare

Hallo. Ich möchte gerne eine Suche in eine Datenbank integrieren die mehrere Spalten über ein Dynamisches Feld durchsucht. Genauer ...

Datenbanken

SQL Befehl zum kopieren von Felder in verschiedenen Spalten

gelöst Frage von snciellDatenbanken2 Kommentare

Besitze eine Microsoft SQL Datenbank mit der ich am rumspielen bin um mich etwas mit SQL Abfragen auseinander zu ...

Datenbanken

MySQL: Zwei Spalten in einer View zählen

Frage von Memo66Datenbanken11 Kommentare

Hallo, ich habe eine Fussballdatenbank mit der Tabelle 'Tore' die wie folgt aussieht Ich möchte nun aus Abfrage wo ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 11 StundenErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 13 StundenWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgborn vor 13 StundenMicrosoft8 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1026 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall15 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)15 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser13 Kommentare

Hallo Leute Ich habe eine interessante Frage. Mich wurde mal interessieren welcher Browser ist eure meinung nach der beste? ...