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

gelöst SQL Datensatzzeilen als Spalten anordnen

Mitglied: joni2000de

joni2000de (Level 1) - Jetzt verbinden

17.12.2010 um 16:49 Uhr, 25387 Aufrufe, 6 Kommentare

Hi Admins,

ich habe da wieder mal ne Frage (DB = Oracle). Wie kann ich die Datensätze einer Tabelle in Spalten einer Abfrage anordnen?

01.
Tabelle Kunden 
02.
NR NAME 
03.
01 Hans 
04.
02 Rudi 
05.
 
06.
Tabelle Kontakt 
07.
KNR KONTAKTART EINTRAG 
08.
01  Handy      123456789 
09.
01  Festnetz   23456789 
10.
02  Mail       123@456.de 
11.
01  Mail       789@456.de 
12.
02  Handy      987654321 
13.
 
14.
Mein Wunschergebnis 
15.
NR NAME HANDY     FESTNETZ MAIL 
16.
01 Hans 123456789 23456789 789@456.de 
17.
02 Rudi 987654321          123@456.de
Die Spaltenüberschriften sollten aus der Tabelle Kontakt übernommen werden. Es sollten so viele Spalten "erzeugt" werden wie es unterschiedliche Einträge in Kontaktart gibt.

Ich bin da noch relativ neu auf dem Gebiet und hoffe auf den richtigen Tip. Danke

Gruß Joni
Mitglied: nxclass
17.12.2010 um 20:09 Uhr
Pivot- oder Kreuz- Tabellen gibt es nicht im normalen SQL.

entweder Du kannst die Tabellen in Normalform umwandeln oder Du versuchst sowas:
01.
SELECT 
02.
  k.*, 
03.
  h.EINTRAG, 
04.
  f.EINTRAG, 
05.
  m.EINTRAG 
06.
FROM 
07.
    Kunden k 
08.
        LEFT JOIN Kontakt h ON (k.NR = h.KNR AND h.KONTAKTART = 'Handy') 
09.
        LEFT JOIN Kontakt f ON (k.NR = f.KNR AND f.KONTAKTART = 'Festnetz') 
10.
        LEFT JOIN Kontakt m ON (k.NR = m.KNR AND m.KONTAKTART = 'Mail') 
11.
;
Bitte warten ..
Mitglied: joni2000de
20.12.2010 um 08:52 Uhr
Hi nxclass,

d. h. wenn ich keinen Einfluss auf die Tabelle habe und ich das richtig verstanden habe muss ich in einer Abfrage vorab die Inhalte von Kontaktart ermitteln (die ich ja nicht kenne) und anschließend eine 2. Abfrage bauen (aufbauend auf den Inhalten der 1. Abfrage) die dann ungefähr so wie deine obige aussieht. Das muss dann immer außerhalb von SQL gelöst werden (z. B. VBS)?

Gruß Joni
Bitte warten ..
Mitglied: Biber
20.12.2010 um 10:05 Uhr
Moin joni2000de,

ich will nochmal ganz ausdrücklich die Aussage von nxclass unterstützen: Bring die Tabellen in eine brauchbare (Normal-)Form..

So wie von dir skizziert ist das nicht brauchbar... nicht für Ad-hoc-Abfragen und Auswertungen geeignet.

Da hat sich irgendein Datenbank-Grundlagen-für-Geographielehrer-VHS-Kurs-Absolvent am Datenmodellieren versucht.

Die implizite Unterstellung, in der Tabelle "Kontakt" werden Entitäten namens "Eintrag" gesammelt und ein "Eintrag" kann vom Typ "Handy", "Mail" oder "Handy" sein...

Dönekens.

Eine Handy-Nummer ist eine Handynummer. Mit definitiv anderen Eigenschaften (oder auch Gültigkeitskriterien) als eine Mailadresse oder eine Festnetznummer.
Hier ist es an der falschen Stelle "strukturiert". Schau dir beispielsweise die "Kontaktdaten"-Felder in einem M$-Outlook an.
Da stehen Telefon dienstl/Telefon privat/Fax/Email dienstlich/Email privat etc als einzelne Felder nebeneinander.
Niemand würde dort eine Liste mit "Eintrag 1" bis "Eintrag 17" erwarten, bei der nach Eingabe die Auswahl "Festnetz"/"Handy"/"Mailadresse" abgefordert wird.

Wenn du mit der Struktur oben weitermachst, dann musst du die Felder wieder mit mehr oder weniger Aufwand als einzeln benennbare Spalten umgruppieren.

Das geht
  • mit PL/SQL --> Oracle-Serverseitig -> das einzig Akzeptable performanzmäßig
  • ab Oracle 11g auch mit dem Schlüsselwort PIVOT (siehe Anmerkungen unten)
  • oder THEORETISCH auch mit irgendeinem anderen Skript/Progrämmle (meinetwegen auch VBS). Ob ich nun ausgerechnet für eine Oracle-DB ein paar ADODB-RecordSets zusammenlügen will... ist Geschmackssache. Falls ihr keinen [Oracle-]DBA in der Firma habt, dann könntest du es evtl unbemerkt machen. Ist so ähnlich wie mit selbstzusammengebrezelten Monster-Trucks... wenn du die nur im eigenen Garten fährst oder besser noch im eigenen Keller, dann wird keiner was dagegen sagen.

Nichtsdestotrotz -> was du richtig erkannt hast: Du musst IMMER die aktuelle [DISTINCT] Anzahl unterschiedlicher Werte in "Einträge" ermitteln,
also die Anzahl der Pivot-"Spalten".
Das gilt auch bei die Nutzung der Oracle 11g-PIVOT-SQL-Syntax.
Und die Anmerkung dazu: das im normalen SQl nutzbare Schlüsselwort PIVOT erleichtert zwar vieles, aber:
Bedauerlicherweise müssen davor und dahinter auch noch ein paar andere Angaben stehen.
Diese Syntax ist ein bisschen ruppig, schau dir bitte mal ein, zwei Suchmaschinen-Fundstellen zu "Oracle pivot" an.

Meine Empfehlung:
  • Lass die Tabelle "Kontakt" ummodellieren. Einzig schmerz- & stressfreier Rat. Alles andere bedeutet jahrelangen Anpassungsaufwand und Resourcenverbrennerei.
  • Wenn das nicht gehen sollte vermeintlich, weil das 2 Manntage Aufwand bedeuten würde laut Dienstleister, dann lass von einem Oraclefuzzy einen VIEW auf die Kontakttabelle anlegen. Mit Pivotierung der heute real vorhandenen "Eintragsarten". Wenn es heute 5 "Arten" sind, dann hat der VIEW 5 Spalten dafür, wenn es im nächsten Juni 12 Werte sind, dann muss der View eben angepasst werden.

Grüße
Biber
Bitte warten ..
Mitglied: nxclass
20.12.2010 um 10:14 Uhr
die Inhalte von Kontaktart ermitteln
anschließend eine 2. Abfrage bauen
... - ja - die 'Kontakt.KONTAKTART' müsste dann natürlich in irgend einer weise bekannt sein:
01.
SELECT KONTAKTART 
02.
FROM Kontakt 
03.
GROUP BY KONTAKTART;
ich keinen Einfluss auf die Tabelle habe
... und evtl. sogar mehrere E-Mail Adressen pro Benutzer gespeichert sind, würde es evtl. Sinn machen:
01.
SELECT 
02.
  ku.*, 
03.
  GROUP_CONCAT( ku.KONTAKTART ) AS 'list_KONTAKTART', 
04.
  GROUP_CONCAT( ku.EINTRAG ) AS 'list_EINTRAG' 
05.
FROM 
06.
    Kunden ku 
07.
        LEFT JOIN Kontakt ko ON (ku.NR = ko.KNR) 
08.
GROUP BY 
09.
  ku.NR 
10.
;
die Kontakt Einträge als Liste zurück zu geben. (GROUP_CONCAT() ist eine MySQL Funktion - aber ich denke bei deiner DB gibt es auch sowas)
Bitte warten ..
Mitglied: joni2000de
20.12.2010 um 12:14 Uhr
Edit
Hat sich erledigt, das Problem liegt woanders (siehe unten).

Hi ihr beiden,

sehe schon, da hab ich wieder was ausgegraben. Dass das Datenbankmodell nicht so toll ist war mir klar. Naja ich weiß nicht wie lange wir noch damit arbeiten, darum möchte ich da nicht zu viel investieren. Erst einmal danke für die Aufklärung.

Da ist noch eine andere Frage aufgetaucht. Wenn mir mal beim obigen Beispiel bleiben. Wenn in der Tabelle Kontakt die Spalte Kontaktart nicht die Kontaktart selber sondern eine Nummer enthalten würde (z. B. Handy = 1, Festnetz = 2, Mail = 3) und es zusätzlich eine Tabelle Kontaktart mit den entsprechenden Einträgen geben würde, wie müsste dann die Abfrage aussehen? Gehen wir davon aus, dass jeder Kunde entweder eine oder keine Kontaktart hinterlegt hat und wir die "Aufteilung" nicht brauchen.

Das wäre dann ja ein zusätzliches join (JOIN Kontaktart KA ON KA.NR = KO.Kontaktart) im left join (LEFT JOIN Kontakt KO on KU.NR = KO.KNR). Wie kriege ich das zusammen?

Nochmal danke für eure Hilfe.

Gruß Joni
Bitte warten ..
Mitglied: joni2000de
20.12.2010 um 14:12 Uhr
Da bin ich nochmal.

01.
case 
02.
   when SO.NR=700 then 'ja' 
03.
   when SO.NR<>700 then 'doppelt' 
04.
   else null 
05.
end as EZ
Kann ich bei obigem Select das Where/Having so gestalten, das ich nur die Zeilen ungleich doppelt kriege (=> null und ja)?
EZ <> 'doppelt' liefert ungültiger Bezeichner

Danke
Gruß Joni
Bitte warten ..
Ähnliche Inhalte
PHP
Werte in einer sql Spalte addieren
gelöst Frage von helmuthelmut2000PHP13 Kommentare

Hallo, Ich habe folgendes Problem. Ich habe eine PHP Seite mit einer MSSQL Datenbank. Da gibt es eine Tabelle ...

Datenbanken
SQL LEFT JOIN in Spalten
gelöst Frage von StfnCstrDatenbanken5 Kommentare

Hallo, ich sehe mal wieder den Wald vor lauter Bäumen nicht. Ich habe 2 Tabellen Tabelle 1: PK, Vorname, ...

Datenbanken

T-SQL: Inhalt verschiedener Spalten in eine Spalte schreiben

gelöst Frage von SuilvenDatenbanken2 Kommentare

Guten Morgen, Ich habe eine Tabelle „Artikelinfo“ mit den Spalten „Art_Nr_Halbzeug“; „Ben_Halbzeug“ und „Bez_Halbzeug“ nun muss ich in eine ...

Datenbanken

SQL COUNT und DESTINCT auf die selbe Spalte

gelöst Frage von membarDatenbanken3 Kommentare

ich will eine Liste erzeugen mit den gleichen Namen und dahinter soll die Anzahl stehen wie of diese vorkommt. ...

Neue Wissensbeiträge
iOS
IOS 11.2.6 verfügbar
Information von sabines vor 33 MinuteniOS

Mit dem Update soll der Bug behoben werden, bei dem eine bestimmte Zeichenkette IOS zum Absturz gebracht hat.

Sicherheit
Sicherheitsrisiko: Die Krux mit 7-Zip
Information von kgborn vor 14 StundenSicherheit

Bei vielen Anwendern ist das Tool 7-Zip zum Entpacken von Archivdateien im Einsatz. Die Software ist kostenlos und steht ...

Internet

Datendealing im WWW Tracking Methoden immer brutaler

Information von sabines vor 1 TagInternet

Interessanter Artikel zum Thema Tracking im WWW und die immer "besseren" Methoden des Trackings. Professor Arvind Narayanan (Princeton-Universität) betreibt ...

Erkennung und -Abwehr

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

Information von kgborn vor 1 TagErkennung und -Abwehr

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

Heiß diskutierte Inhalte
Server
Route-Befehl Unterstützung (unter CMD)
gelöst Frage von FKRR56Server37 Kommentare

Guten Tag , i.M. habe ich Probleme über den CMD-Route-Befehl ein Routing auf einen entfernten Server zuzulassen. Der Server ...

Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1028 Kommentare

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

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgbornMicrosoft17 Kommentare

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

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser15 Kommentare

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