Spalten indizieren

ReinyBen

Benutzer
Beiträge
13
Hallo,

befürchte es widerspricht der typischen Anordnung von Datensätzen, aber wie kann ich bei einer SQL-Abfrage eine Spalte gemäß (Index)wert einer anderen Tabelle abfrage? Beispiel:

ID Tabelle Grünzeug
1 Tomate Birne Apfel
2 Erbse Möhre Kohl
3 Ananas Orange Lemone

Ich möchte eine andere Tabelle abfragen, die (per LEFT JOIN) die Zeile auswählt.
Nun soll dort gemäß einer Variable XYZ je nach Wert 1, 2 oder 3 die SPALTE der Zeile gewählt werden. Also bei Auswahl z.B. Zeile 2 und Index 3 soll dann "Kohl" angezeigt werden.

DANKE & VG Reiny
 
Werbung:
Ja, Deine Befürchtung trifft zu.

Du würdest die Daten anders modellieren:
Code:
ID|Index|Grünzeug
   1|        1|Tomate
   1|        2|Birne
   1|        3|Apfel
   2|        1|Erbse
   2|        2|Möhre
   2|        3|Kohl
   3|        1|Ananas
   3|        2|Orange
   3|        3|Lemone
Ggf auch mit fortfolgender ID. So oder so, damit würdest Du einen ganz normalen Join über ID und Index machen.
Es geht natürlich auch anders. Z.B. wenn Du die Grünzeugdaten zeilenweise anordnest wie bei Dir oben, aber nicht in einzelnen Spalten, sondern in einem Array oder JSON oder JSONB.
Aber dafür brauchst Du eine DB, die das kann, wie z.B. Postgres. Ob es mit MS SQL geht, weiß ich nicht. Müsstest Du mal nachschauen.

Grundsätzlich gilt:
Eine Tabelle möchte immer eine Liste sein, im einfachsten Fall wie ein Einkaufszettel, eine Spalte, alles untereinander. Die Dynamik entsteht durch die unendliche Länge des Zettels. Kein Mensch schreibt einen Einkaufszettel nebeneinander, besonders nicht, wenn neben(!) dem Was auch noch eine Menge oder Einheit steht, also Informationen mit direkter Abhängigkeit zu dem Hauptbestandteil der Liste.

Das Gegenteil der Dynamik einer Tabelle sind die Spalten, sie sind nicht dynamisch, sie bilden eine fixe, definierte Struktur, die nicht on-the-fly erweiterbar ist. Gibt es also mehr Grünzeug, hat man keine Spalte dafür, gibt es weniger, bleiben immer Spalten frei. Will man alles Grünzeug auflisten/reporten, muss man immer alles aus verschiedenen Spalten zusammen basteln. Bekommt das Grünzeug weitere Merkmale, wie Menge, Sorte, Reifezeit, Verfügbarkeit wird alles noch schlimmer, noch mehr Spalten, die irgendwann wieder nicht reichen.

Also überleg Dir gründlich, ob Du die Struktur oben so lassen willst.
 
Danke für Deine schlüssige Erklärung!
In Wirklichkeit sind die Zeilen Länder mit ca. 10 Einträgen wie Währung, Umrechnungskurs, Ländercode usw. und dann kommen *3 Steuercodes* . In einer reinen Zeilendarstellung wären somit die ersten 10 Werte redundant (was zwar unschön ist aber SQL nicht juckt;-).
Damit die Werteeingabe schlank bleibt, müsste ich somit in SQL umformen, sorry die blöde Frage: Wie mache ich das am einfachsten mache (Stichwort reicht)?
Komme aus der SPSS Ecke, da gabs nen TRANSPONSE :)
 
TRANSPOSE: In MS SQL gibt es PIVOT / UNPIVOT, vielleicht nennt es sich auch anders, aber gibt es.
Das eignet sich vor allem, wenn die betroffenen Felder fix sind, also 3 Gemüse oder 1 Währung, 1 Ländercode, 1 Kurs.

Deine echten Inhalte haben aber eine ganz andere Semantik als die 3 Gemüse aus dem Ausgangspost. 3 Gemüse sind 3 Informationen der gleichen Art. Land, Code und Währung dagegen haben unterschiedliche Bedeutung.
SQL für sich juckt gar nichts, es gibt für nahezu jedes Problem ein passendes Statement. Es ist immer nur die Frage, wie gut ein Modell normalisiert ist und wie allgemein ein SQL Befehl einsetzbar ist oder wie gut/dynamisch das gebaute Modell mit den Anforderungen fertig wird.

Mir ist damit letztlich nicht klar, was überhaupt Dein Problem ist. Schreib malechte Daten hin, Ausgangssituation und Wunschergebnis. Und Randbedingungen (dynamische SQL Parameter, ..)
 
Es geht um Flugzeugbetankungen, der je nach Land und Kraftstoffsorge (Kerosin (JET) oder AVGAS) die richtige Mineralölsteuer zugeordnet werden soll.
Die Datei Steuersätze ist somit eine (noch unvollständige) Matrix von Mineralölsteuerbeträgen (Länder = Zeilen, Spalten = Kraftstoffsorten.

Wirklich Danke für Deine Hilfe! Im Beispiel habe ich Äpfel mit Birnen verglichen ;-)

R.
 

Anhänge

  • Betankungen.PNG
    Betankungen.PNG
    42,4 KB · Aufrufe: 11
  • Steuersätze.PNG
    Steuersätze.PNG
    40,3 KB · Aufrufe: 8
Hm, und jetzt bitte noch mal die Frage! Was ist Wunsch und was Status Quo?

Wenn Du ein gemeinsames Merkmal in 2 Tabellen hast, kannst Du darüber joinen und alle Felder aus beiden Tabellen nebeneinander ausgeben.
Wenn Du diese Felder allerdings per Index ansprechen möchtest oder selektiv per Index nur eines der verfügbaren Felder haben möchtest, wird es etwas umständlicher. Sowas würde man problemlos in einem Client programmieren. In SQL bräuchte man eine Stored Procedure.

Eine Matrix hast du ja sowieso immer als Ergebnis. Die kannst Du mit Pivot "auf den Kopfstellen. Dann erhälst Du meinetwegen die Länder als Spalten und die anderen Angaben als Zeilen.

Deine Bilder haben übrigens den Nachteil, dass sie unvollständig sind und nicht weiterzuverarbeiten. Wie lauten die Spaltennamen von Betankung? Wie oben schon angedeutet, für eine gute Verständlichkeit und tatsächlich richtige Modellierung oder Formulierung eines SQL Statements ist die Semantik wichtig. Spaltennamen, sofern sinnvoll benannt, sind da ungemein hilfreich.
 
Sorry die lange Auszeit - wenn Du nun keine Lust hast Du antworten verstehe ich das!
Im Ergebnis soll hinter der Betankungs-Zeile dann der Steuersatz stehen, und zwar je nach LAND (=Zeile in Steuersätze) und Kraftstoll-SORTE (= JET, AVGAS oder MOGAS) eine der 3 letzten Spalten.
Vllt ist es wirklich am Einfachsten, in der Tabelle "Steuersätze" jede Zeile zu verdreifachen und dann stehen die 3 Steuersätze untereinander. Wie mache ich das am Einfachsten?

VG ReinyBen
 

Anhänge

  • Betankungen mit Kopf.PNG
    Betankungen mit Kopf.PNG
    49,2 KB · Aufrufe: 3
Werbung:
Wie mache ich das am Einfachsten?

beschäftige Dich mit Normalisierung, Google kennt dazu massig viel. Aus Deinen Bildern ist schwer zu erkennen, was Du hast oder willst, aber aus einer Tabelle Land, Kraftstoff, Steuersatz bei Kenntniss von Land und Kraftstoff dann den Steuersatz zu ermitteln ist Grundlagenwissen zu Datenbanken.
 
Zurück
Oben