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

Frage Entwicklung Datenbanken

Mitglied: joni2000de

joni2000de (Level 1) - Jetzt verbinden

17.12.2010 um 16:49 Uhr, 24564 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
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 8 StundenViren und Trojaner1 Kommentar

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 12 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware8 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...