crosstab erklärung

Hallo Leute!

Ich habe eine Frage bezüglich der crosstab-Funktion von PostgreSQL.

Ich habe mir eine Abfrage mit crosstab zusammengebaut, verstehe sie aber nicht so richtig. Vielleicht kann mir es jemand anhand meines einfachen Beispiels erklären. Es wäre jedenfalls supernett.

Grundlage der Abfrage ist eine VIEW, die sich aus 3 Tabellen zusammensetzt und so aussieht:

ID, Attributwert, Attribut, Artikelnummer, Artikelbezeichnung
 8;"46,0 cm";"Höhe";  "70010";"KF10 "Der Kuchen-Flachspeicher""
 9;"14,3 cm";"Tiefe"; "70010";"KF10 "Der Kuchen-Flachspeicher""
10;"46,0 cm";"Breite";"70010";"KF10 "Der Kuchen-Flachspeicher""
22;"33,0 cm";"Höhe";  "25111";"CBH 11 11kW 400V UT"
23;" 9,0 cm";"Tiefe"; "25111";"CBH 11 11kW 400V UT"
24;"21,0 cm";"Breite";"25111";"CBH 11 11kW 400V UT"
33;"47,2 cm";"Höhe";  "40018";"DH 40018 Durchlauferh. hydr. 18kW"
34;"13,9 cm";"Tiefe"; "40018";"DH 40018 Durchlauferh. hydr. 18kW"
35;"23,6 cm";"Breite";"40018";"DH 40018 Durchlauferh. hydr. 18kW"



SELECT *
FROM crosstab(
  'SELECT artikelnummer, attribut, attributwert
   FROM article_info_data
   ORDER BY artikelnummer',
  'SELECT bezeichnung
   FROM features
   ORDER BY id')
AS artikel_daten(nummer text,
  "Höhe" text ,
  "Breite" text ,
  "Tiefe" text)
ORDER BY nummer;

Ergebnis ist eine Tabelle mit den Attributen, als Spaltenüberschriften und den Artikelnummern als Zeilenüberschriften. Das ist prima! Genau so will ich es haben, aber:
ich würde gerne die Spaltenüberschriften nicht angeben müssen. da diese dynamisch sind.

Ich verstehe nicht, warum ich diese angeben muss, da ich sie doch eigentlich in der zweiten Abfrage (SELECT bezeichnung FROM features ORDER BY id) schon habe.

Gruß
Noël

Hallo,
Ich bin zum ersten Mal auf diesem Forum und kriege irgendwie den crosstab von folgender Tabelle nicht hin

select pcon, element, numberofelements
from pconcomposition as B
where B.Pcon = ‘CO2(g)’

was folgender Tabelle entsppricht


pconelementnumberofelement
CO2(g) C 1[RIGHT]1[/RIGHT]


CO2(g) O 2[RIGHT]2[/RIGHT]



ich habe schon mehrere sql Strings probiert, u.a.


SELECT *
FROM crosstab(
‘SELECT a.element, a.numberofelement
FROM pconcomposition as a
where a.pcon = “CO2(g)”’)
AS NewPCC(“E1” text , “E2” text, “E3” text, “E4” text, “E5” text)


Als Ergebnis benötige ich

CO2(g) C 1 O 2

mit den entsprechenden dynamisch angepassten Spaltennamen,
da je nach verbindung beliebig viele Elemente auftauchen können.


aber erhalte nur fehlermeldungen.
Ich habe zwar schon einige Artikel gelesen, aber die Beispeile sind so umfangreich und kompliziert, dass ich da nicht durchblicke.
In diesem Fall kommt wohl auch noch das Problem mit den Anführungsstrichen hinzu…

ausserdem muss bei meinem Ergebniss eine flexible Spaltenbenennung erfolgen, da je nach chemischer Verbindung (hier CO2(g) ) beliebig viele Zeilen transponiert werden müssen.


Könnte mir jemand helfen, diese Tabelle zu transponieren ?
Ich habe zar schon ein bisschen SQl gemacht, aber das ist lange her und
nicht unbedingt PostgresSQL gewesen…


Vielen Dank im voraus


Thomas





Uff …

Ich habe mir eine Abfrage mit crosstab zusammengebaut, verstehe sie aber nicht so richtig. Vielleicht kann mir es jemand anhand meines einfachen Beispiels erklären. Es wäre jedenfalls supernett.

Grundlage der Abfrage ist eine VIEW, die sich aus 3 Tabellen zusammensetzt und so aussieht:



Ergebnis ist eine Tabelle mit den Attributen, als Spaltenüberschriften und den Artikelnummern als Zeilenüberschriften. Das ist prima! Genau so will ich es haben, aber:
ich würde gerne die Spaltenüberschriften nicht angeben müssen. da diese dynamisch sind.

Dann bastle Dir Dein SQL, was die Crosstable erzeugt, auch dynamisch. Die Doku beschreibt, wie das geht.

Ich verstehe nicht, warum ich diese angeben muss, da ich sie doch eigentlich in der zweiten Abfrage (SELECT bezeichnung FROM features ORDER BY id) schon habe.

Gruß
Noël

Nun, ich habe bisher das erfogreich gemieden (aber auch schon mit gespielt). Fakt ist, daß Funktionen, die eine Tabelle liefern (so wie auch crosstab() und Konsorten) entweder die Struktur des Resultates definieren müssen oder man beim Aufruf dies tun muß. Da crosstab() das vorher nicht wissen kann, ist es nötig, es passend aufzurufen.

Bleibt zu sagen:

crosstab() ist in CONTRIB, nicht in CORE. Das mag Gründe haben, über die ich nicht urteilen mag. Ich befürchte, das Dinge wie crosstab() bei größeren Datenmengen einfach nur sind.

Außerdem:
vieles kann man auch ohne crosstab() machen:

test=*# select * from ct;
 id | zeile | eigenschaft |  wert
----+-------+-------------+--------
  1 | test1 | farbe       | grün
  2 | test1 | gewicht     | 10kg
  3 | test1 | geruch      | süß
  4 | test2 | farbe       | blau
  5 | test2 | geruch      | stinkt
(5 Zeilen)

Zeit: 0,205 ms
test=*# select zeile, case when eigenschaft = 'farbe' then wert else null end as farbe, case when eigenschaft = 'gewicht' then wert else null end as gewicht from ct;
 zeile | farbe | gewicht
-------+-------+---------
 test1 | grün  |
 test1 |       | 10kg
 test1 |       |
 test2 | blau  |
 test2 |       |
(5 Zeilen)

Mal ohne Spalte “geruch” in diesem Beispiel (persönliche Faulheit…)


Andreas

Dann lerne quoten. TOFU widert mich einfach nur an…


Andreas

Ok,
also wenn dieses Forum dazu da ist andere Leute blöde anzumachen und sinnlose Kommentare dazuzuschreiben ohne irgendwelche Hinweise zu geben wo es eine Lösung gibt oder nur auch mal wirklich das Problem näher zu beleuchten, dann bin ich hier wohl falsch.
Hast Du überhaupt verstanden, dass es nicht um PGPL/SQL geht ?

Ausserdem habe ich ja nicht gesagt, dass ich nicht schon andere Anführungsstriche und Lösungen versucht habe.

Zynische Bemerkungen kann ich selber machen, dafür brauche ich keine Hilfe.

Gibt es hier auch sowas wie höfliche Leute oder sollte ich das Forum doch lieber auf Nimmerwiedersehen verlassen ?

Sicher ist, wenn mich ab jetzt mal jemand was in Chemie fragt, werde ich als promovierter Chemiker auch nicht anders antworten als mit solch einem
idiotischem Gehabe…

Ciao

Du entführst einen anderen Thread, statt auf selbigen zu verweisen.
Du quotest den Inhalt des ersten Postings komplett, obwohl du dieses Posting gar nicht benötigst für dein eigenes Posting.
Du schreibst über dem Posting, so etwas nennt man TOFU und ist sehr sehr ungern gesehen, weil es den Lesefluss komplett zerstört.

Wenn du das alles hinbekommen hast - was wohlgemerkt noch gar nicht mit deinem Problem sondern nur mit einer passenden Ausdrucksweise zu tun hat - dann können wir mal über dein Problem reden.




Sicher ist, wenn mich ab jetzt mal jemand was in Chemie fragt, werde ich als promovierter Chemiker auch nicht anders antworten als mit solch einem idiotischem Gehabe…

Ich komme auch nicht in dein Labor und mache dir Vorschriften, wie du bestimmte Untersuchungen durchführst oder wie du Berichte zu schreiben hast. Im Gegenzug wirst du auch keine Artikel lesen, die in Englisch geschrieben sind - aber von unten nach oben, die erste Zeile am Ende des Artikels. Ob du nun einen Dr. dein eigen nennst oder nicht - so ein Spruch zieht hier nicht, im Gegenteil. Als promovierter Wissenschaftler solltest du zu vernünftigen Postings in der Lage sein.

Möglicherweise.

Hast Du überhaupt verstanden, dass es nicht um PGPL/SQL geht ?

Ich denk schon, schon weil mir ‘PGPL/SQL’ nix sagt.

Ausserdem habe ich ja nicht gesagt, dass ich nicht schon andere Anführungsstriche und Lösungen versucht habe.

Bahnhof.

Zynische Bemerkungen kann ich selber machen, dafür brauche ich keine Hilfe.

Na klar doch. Ich bin stolz auf Dich.

Gibt es hier auch sowas wie höfliche Leute oder sollte ich das Forum doch lieber auf Nimmerwiedersehen verlassen ?

Ja.

Auf welchen Teil Deiner Frage Du diese Antwort beziehst, bleibt aber Dir überlassen.

Sicher ist, wenn mich ab jetzt mal jemand was in Chemie fragt, werde ich als promovierter Chemiker auch nicht anders antworten als mit solch einem
idiotischem Gehabe…

Ciao

Chemische Formeln sagen mir nicht allzu viel. Schule ist lange her, damals war ich aber da nicht wirklich desinteressiert und schlecht, hab es nur vergessen, weil ich es nicht brauche. Allerdings kann ich mich echt nicht daran erinnern, daß man Formeln von unten nach oben lesen muß. Ist das echt so?

Zu Deiner Frage:

Mehr Fakten, weniger Prosa. Deine Tabellen sind so nicht nachvollziehbar. Idealerweise solltest Du, verpackt in passende Code-Tags, die Definition der Tabellen liefern, und was Du als Resultat erwartest. Es macht cirka wenig bis deutlich weniger als Null Spaß, sich diese Informationen aus TOFU in einem entführten Thread extrahieren zu müssen. Das, denke ich, sollte ein promovierter Wissenschaftler besser können.

Und beleidigte Leberwurst kannst Du in Deinem Labor spielen.


Andreas

Du musst diese angeben, weil die beiden SELECTs, welche crosstab übergeben werden - String-Parameter sind. D.h. die cross-tab-funktion selbst analysiert die SELECT-Anweisungen nicht, sondern führt sie einfach aus - ähnlich wie man einen String einer EXECUTE anweisung übergeben würde.

Man könnte es einen pragmatischen Kompromiss nennen, den der Entwickler dieser Fkt. da produziert hat - damit die Implementation nicht so kompliziert wird. Es ist also eher eine technische Notwendigkeit.

Gruß

Hallo,
na also es geht doch . Wenigstens waren unter den Anmerkungen auch ein paar sachliche Hinweise, was schief gelaufen ist. TOFU ist für mach was zu essen sonst nichts. Ich habe “Antwort” deswegen nicht gewählt, weil meine Anmerkungen ja nicht eine tatsächliche Hilfestellung für die Lösung des Problems waren sondern nur eine Unterstützung der Anfrage die immerhin schon seit dem 25.5 bestand ohne dass da eine sachlich fundierte Antwort erfolgte. Dies war zum Teil mit ein Grund für meine Antwort zumal die auf meine Anfrage gemachten Anmerkungen auch nicht gerade hilfreich waren.
Weitere Details hätte ich schon noch gegeben, wenn sich jemand meldet.
Übrigens, da ich bereits mit SQL in Wirtsprachen wie VB, VBA, Delphi oder VBscript gearbeitet habe bin ich mit dem Problem Anführungsstriche gut vertraut. Aber bei PostgresSQL sind doch wohl sowohl ’ als auch " möglich.

Mein Hauptproblem besteht eigentlich darin eine Struktur in SQL zu schaffen, die der WHILE DO oder LOOP DO -Struktur entspricht und zwar aus folgendem Grunde. Ich arbeite an einem nationalen Datenbankprojekt mit, in dem eine Tabelle wie folgt aufgebaut ist:

z.B. für die Verbindung Formaldehyd HCHO bzw. CH2O

Verbindung Element Anzahl der Atome
z.B. Formaldehyd C 1
Formaldehyd H 2
Formaldehyd O 1

Mit Crosstab möchte ich daraus eine Tabelle erzeugen, die nur eine Zeile enthält und (in diesem Fall) 7 Spalten:

Formaldehyd C 1 H 2 O 1

Aber dies setzt eine while Do ähnliche Struktur voraus, die es unter SQL nicht zu geben scheint. Das selbe Problem hat sich mir auch bei der Formelerstellung gestellt:

Unter ACCESS läßt sich die CONCAT Funktion, um die Elementnamen und die Atomanzahl zusammenzufügen und die IIF Anweisung nutzen, um daraus im Falle eines Atomes ein Leerzeichen zu haben.
Jedoch ist die Anzahl der Elemente unterschiedlich, in Abbhängigkeit von der Verbindung (bei Formaldehyd CH2O 3, bei Kohlendioxid CO2 nur 2, meistens jedoch unter 10).
Wie lassen sich die erzeugten Strings bzw. (oben für Crosstab) Tabellenspalten für alle Verbindungseintäge zusammenfügen ?

Geht das überhaupt ?


ThommyW

Was passiert bei Wasser, das hat nur 2 Elemente. Was passiert bei komplexeren Molekülen mit mehr als 3 Elementen?


Aber dies setzt eine while Do ähnliche Struktur voraus, die es unter SQL nicht zu geben scheint.

ACK. Man kann z.B. pl/pgsql nutzen, dort gibt es solche Dinge. Du kannst aber keine Tabellen erstellen, wo eine Zeile mal 5 Spalten und die nächste dann 8 und dann wieder nur 3 Spalten hat. Wenn, dann haben alle Zeilen gleich viel Spalten, notfalls mußt Du die freien Felder mit NULL besetzen.

Das selbe Problem hat sich mir auch bei der Formelerstellung gestellt:

Unter ACCESS läßt sich die CONCAT Funktion, um die Elementnamen und die Atomanzahl zusammenzufügen und die IIF Anweisung nutzen, um daraus im Falle eines Atomes ein Leerzeichen zu haben.
Jedoch ist die Anzahl der Elemente unterschiedlich, in Abbhängigkeit von der Verbindung (bei Formaldehyd CH2O 3, bei Kohlendioxid CO2 nur 2, meistens jedoch unter 10).
Wie lassen sich die erzeugten Strings bzw. (oben für Crosstab) Tabellenspalten für alle Verbindungseintäge zusammenfügen ?

Geht das überhaupt ?


ThommyW

Ich weiß nicht, ob Dir folgendes weiterhilft:

test=*# select * from chemie;
 verbindung  | element | atomanzahl
-------------+---------+------------
 Formaldehyd | C       |          1
 Formaldehyd | H       |          2
 Formaldehyd | O       |          1
(3 rows)

test=*# CREATE AGGREGATE array_accum (anyelement) ( sfunc = array_append, stype = anyarray, initcond = '{}');
CREATE AGGREGATE
test=*# select verbindung, array_to_string(array_accum( element || atomanzahl),' ')  from chemie group by verbindung;
 verbindung  | array_to_string
-------------+-----------------
 Formaldehyd | C1 H2 O1
(1 row)

test=*# select verbindung, array_to_string(array_accum( element || atomanzahl),'')  from chemie group by verbindung;
 verbindung  | array_to_string
-------------+-----------------
 Formaldehyd | C1H2O1
(1 row)

Andreas

An deiner Stelle würde ich auf Stored Procedures ausweichen, die die Arbeit erledigen. Das geht zwar auch mit IF und mit CONCAT, wird aber irgendwann recht häßlich.

In PostgreSQL wird das einfache Hochkomma für Daten verwendet, Bezeichner hingegen werden mit Anführungszeichen umhüllt.

wie AK schon sagte - eine Tabelle (das ist der gegenstand des RDBMS) ist ein konstrukt, mit einer definierten anzahl von Spalten - die enthaltenen Entitäten hat also auch immer diese definierte Anzahl an Attributen

Dir bleibt also nichts anderes über, als das Ergebnis 2 spaltig zu erzeugen - wobei deine Formel ja zumindest in einer Leicht verarbeitbaren Struktur geliefert werden sollte - vielleicht reichen ja die Leerzeichen - oder die Trenner … was die DB liefert muss man ja nicht so 1:1 darstellen …

du koenntest dir also ne Funktion schreiben, die ein ResultSet wie beschrieben liefert (2 spalten - Formel als String) … dazu kannst dann ja auch noch ein View bauen, was die Funktion abfragt - einfach damit es sich für die Anwendung wieder wie ne schnoede Table anfuehlt

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

Das schließt sich nicht aus.

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?

Wenn ich Dich richtig verstehe, ist Dir COALESCE() noch unbekannt.

Andreas

Wie akretschmer schon sagt, Stored Procedures und deine Wünsche schließen sich nicht aus. Der Code in deinem Programm heißt danach nicht

SELECT spalte1, spalte2 FROM tabelle

sondern

SELECT spalte1, spalte2 FROM funktion()

Hallo,noch würde ich gerne auf SQL Procedures verzichten.Dank Eurer Hinweise habe ich zwar interessante Befehle kennengelernt, aber Coalescence scheint nur zu funktionieren wenn ein Wert NULL ist, nicht wenn das Feld nicht existiert.Mit der Verknüpfung der Unterabfragen unter Benutzung von Exist gibt es noch Probleme, zumal dienicht die Spalte abwesend ist sondern wie oben beschrieben eine ZeileZeile abwesend ist. Leider entsteht ein Fehler: FEHLER: Fehler »Syntaxfehler« bei »as« at character 360
Dans l’instruction :

SELECT pcon, datatype, value, calcmode, unctype, negativeunc, positiveunc
FROM "data_standard"
WHERE EXISTS 
(Select pcon, value, calcmode, unctype, negativeunc, positiveunc
from "data_standard"
where ((datatype ='DFG298') and (category = 'F') and (tstate = 'S') and (pcon = 'CO2(g)'))
group by pcon, value, calcmode, unctype, negativeunc, positiveunc) as A
inner join
(SELECT pcon, datatype, value, calcmode, unctype, negativeunc, positiveunc
FROM "data_standard"
WHERE EXISTS
(Select pcon, value, calcmode, unctype, negativeunc, positiveunc
from "data_standard"
where ((datatype ='DRS298') and (category = 'F') and (tstate = 'S') and (pcon = 'CO2(g)'))
group by pcon, value, calcmode, unctype, negativeunc, positiveunc) as B
)

Weiss jemand ob das so funktionieren kann und wie man die Abfragen verknüpft ?

Danke

ThommyW

Du müsstest zuerst im “information_schema.columns” nachschauen, ob die Spalte vorhanden ist und darauf aufbauend mit CASE arbeiten.

Allerdings wird das irgendwann sehr häßlich und umständlich, genau darum wurden dir Stored Procedures empfohlen.

Kannst Du dies näher begründen?

Andreas

Hallo,
also ich gebe zu: eigentlich soll ich mich auf lange Sicht sowieso mit PGPL SQL beschäftigen, weil noch andere Funktionen zur Sicherung der Konsistenz der Datenbasis benötigt werden, aber wie gesagt …auf lange Sicht…mit geringer Priorität bisher. Die angebenen Lösungen brauche ich aber mit aller größter Priorität innerhalb der nächsten zwei Wochen, da wir diese an eine Softwarefirma geben müssen, damit diese unsere gewün-schten Parameterdateienparser und Erstellungsprogram-me für geochemische Rechenprogramme damit erstellt.
Ich selber kann zwar Delphi und VBA, kenne mich aber zugegebenerweise nicht mit PGPL-SQL aus, würde also wohl zu lange brauchen, um mich durch den Syntax und die Problemstellung gearbeitet zu haben. Ich weiss auch nicht, ob mein Projektleiter einverstanden ist, wenn ich diese Funktion in der Datenbank implementieren will, aber da da könnte man ja fragen: In der Regel besteht er aber auf möglichst einfachen Lösungen, ich bin da eher das Gegenteil.
Im übrigen habe ich schon alle grundlegenden SQL-befehle eingesetzt (allerdings Coalescence, Nullif, etc kannte ich in der Tat (wie CrOSSTAB)noch nicht, nochmals danke) und wollte SQL mal ein bisschen mehr ausreizen. Wenn das mit normalem SQL möglich ist, und das erscheint mir so (siehe oben), dann sollte das, wie ich finde, auch damit erfolgen. Wenn ich mich mit SQL beschäftige, dann möchte ich es auch umfassend kennenlernen und zu nutzen wissen:
Also warum schreibt mir hier keiner mal einen lauffähigen SQL-Befehl mit CROSSTAB hin bezüglich der angegebenen Tabelle und eine Möglichkeit im Falle der Abwesenheit eines Feldes nicht die ganzen übrigen Informationen aus “data_standard” zu verlieren (siehe code ganz oben) sondern trotzdem eine vernünftige Tabelle mit G, H, S zu erhalten ???
Ist das denn schon zu viel für SQL ???
Denn gerade beim letzteren Problem ist doch fast sicher, dass das irgendwie gehen müsste…eigentlich…
Warum antwortet keiner aml mit konkretem Code ? Oder weiss eigentlich doch keiner, so wie ich, wie das ganz genau (!!) geht :wink:




Grüße

ThommyW

Das geht vielleicht gerade noch so in SQL, mit vielen Umwegen und Hilfsbrücken.


Denn gerade beim letzteren Problem ist doch fast sicher, dass das irgendwie gehen müsste…eigentlich…
Warum antwortet keiner aml mit konkretem Code ? Oder weiss eigentlich doch keiner, so wie ich, wie das ganz genau (!!) geht > :wink: >

Dir wurde bereits mehrfach gesagt, dass das kompliziert wird und es andere, einfache Lösungen gibt.

Du kannst jetzt entweder anfangen zu lernen oder du kannst weiter deinen eingeschlagenen Weg verfolgen, das bleibt dir überlassen.
Die Tatsache, das z. B. akretschmer nicht wie üblich ein passendes Stück Code liefert (oder bisher geliefert hat), reicht schon als Indikator, dass das nicht ganz einfach ist.

Oh, und btw: niemand ist hier dafür zuständig, eure Probleme zu lösen. Das Posten in einem Forum ist freiwillig. Wenn du gesicherte Ergebnisse haben möchtest, kauft euch bitte Support ein.