Hallo,
mir ist klar, dass das unter PGPL \SQL geht mit Procedures geht. Dort gibt es vermutlich alles was Delphi hat auch.
Allerdings sollen die Daten das Ergebnis einer Abfrage aus phpPgAdmin sein. Wenn es da leere Spalten gäbe wäre das nicht schlimm, die Gesamtanzahl der Spalten sei z.B. 10, da mehr Elemente nie auftreten. Wäre es möglich bei Verzicht auf die spaltenanzahl-flexible Struktur eine SQL-Abfrage mit CrossTab zu formulieren die der in dem ersten posting (von noel…) gleicht ?
Ich hätte gerne mal eine bezüglich der angegebenen Tabelle funktionierende Abfrage mit Crosstab.
Mir kommt da aber noch eine andere gute Idee:
Für eine andere Tabelle mit thermodynamischen Daten habe ich folgendes Problem gehabt:
Es gibt für ein dieselbe Verbindung mehrere thermodynamische Daten. Dieses Mal also nicht verschiedene Elemente mit einer Anzahl von Atomen sondern z.B. freie Enhalpie G, Enthalpie H und Entropie S der Bildung der Verbindung in einer Spalte namens “Datatype”. Also habe ich einen INNER JOIN aller Unterabfragen bezüglich dieser Einträge gemacht und dann die Ergebnisspalten mit Aliasbe-zeichnungen versehen und als Spalten in einer einzeiligen Tabelle hinzugefügt. Mit insgesamt 8 Aliasspalten war das Problem gelöst… (neben dem Wert der thermodynamischen Größe werden noch einige statistische Fehler (uncertainties) mit abgefragt sowie weitere hier unwichtige Werte)
Ausser: falls ein einziger Eintrag fehlt, dann hat die Ergebnistabelle Null Zeilen.
[size=100][font=Calibri]Select A.Pcon, [/font][/size]
[size=100][font=Calibri]A.value as DFG298_value, A.calcmode as DFG298_calcmode, A.unctype as DFG298_ unctype,[/font][/size]
[size=100][font=Calibri]A.value as DFG298_negativeunc, A.value as DFG298_positiveunc,[/font][/size]
[size=100][font=Calibri]B.value as DFH298_value, B.value as DFH298_calcmode, B. unctype as DFH298_unctype,[/font][/size]
[size=100][font=Calibri]B.value as DFH298_negativeunc, B.value as DFH298_positiveunc,[/font][/size]
[size=100][font=Calibri]C.value as S298_value, C.value as S298_calcmode, C. unctype as S298_unctype,[/font][/size]
[size=100][font=Calibri]C.value as S298_negativeunc, C.value as S298_positiveunc[/font][/size]
[size=100][font=Calibri]From[/font][/size]
[size=100][font=Calibri]([/font][/size]
[size=100][font=Calibri](Select pcon, value, calcmode, unctype, negativeunc, positiveunc[/font][/size]
[size=100][font=Calibri]from "data_standard"[/font][/size]
[size=100][font=Calibri]where ( (datatype ='DFG298') and (category = 'F') and (tstate = 'S'))[/font][/size]
[size=100][font=Calibri]group by pcon, value, calcmode, unctype, negativeunc, positiveunc)[/font][/size]
[size=100][font=Calibri]as A [/font][/size]
[size=100][font=Calibri]inner join [/font][/size]
[size=100][font=Calibri](Select pcon, value, calcmode, unctype, negativeunc, positiveunc[/font][/size]
[size=100][font=Calibri]from "data_standard"[/font][/size]
[size=100][font=Calibri]where ( (datatype = 'DFH298') and (category = 'F') and (tstate ='S'))[/font][/size]
[size=100][font=Calibri]group by pcon, value, calcmode, unctype, negativeunc, positiveunc[/font][/size]
[size=100][font=Calibri]) as b[/font][/size]
[size=100][font=Calibri]on a.Pcon = b.pcon[/font][/size]
[size=100][font=Calibri])[/font][/size]
[size=100][font=Calibri]inner join[/font][/size]
[size=100][font=Calibri](Select pcon, value, calcmode, unctype, negativeunc, positiveunc[/font][/size]
[size=100][font=Calibri]from "data_standard"[/font][/size]
[size=100][font=Calibri]where ((datatype = 'S298') and (category = 'F') and (tstate ='S'))[/font][/size]
[size=100][font=Calibri]group by pcon, value, calcmode, unctype, negativeunc, positiveunc[/font][/size]
[size=100][font=Calibri]) as c on C.pcon = A.pcon[/font][/size]
[size=100][font=Calibri]where (pcon = 'CO2(g)')[/font][/size]
Weiss jemand, wie es möglich ist, (eventuell mit “count = 0”, “exists”, “when condition” ) in Postgres-SQL dafürzu sorgen, dass in dem Fall die Spalte mit dem Feldwert “NULL” erhalten wird oder gar nicht erzeugt wird?
Theoretisch liesse sich das übrigens auf die Elemente in der angegebenen Tabelle auch anwenden, wenn man einfach vorgibt, dass nach jedem (von 50 bis 86) Elementen (ich weiss nicht wieviele in der DB sind) gesucht wird, die Unterabfragen also mit der Verbindung in einer Spalte und einem gegebenen Element in der anderen Spalte gebildet werden:
Unterabfrage für eines von vielen Elementen:
(Select pcon, element, numberofelement
from “pconcomposition”
where ((pcon = ‘CO2(g)’) and (element = ‘C’) )
group by pcon, element, numberofelement
)
Führt man dies für alle möglichen Elemente durch (min. 50, max. 100 INNER JOINS, Das Beispiel war organische Chemie, praktisch ist es aber anorganisch) und verhindert das Verschwinden des Ergebnisses bei Abwesenheit der Zeile, dann wäre es möglich eine Tabelle zu schaffen, die genau das gleiche wie die CrossTab-Tabelle enthält.
Im übrigen würde ich das Problem aber auch gerne für den oben angegebenen Code lösen. Weiss jemand wie das geht ?
Danke im voraus
Grüße
ThommyW