Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Abfrage mit dynamischen Spaltename (https://www.delphipraxis.net/185863-abfrage-mit-dynamischen-spaltename.html)

waldforest 13. Jul 2015 11:29

Datenbank: Firebird • Version: 2.5 • Zugriff über: Zeos

Abfrage mit dynamischen Spaltename
 
Hallo,
gibt es eine Möglichkeit den Spaltennamen in einem SQL-Statement, welches ich in eine Query über SQL.loadfromfile( einlesen möchte dynamisch zu definieren .

Im konkreten Beispiel möchte das ich eine Auswertung über die letzte 6 Wochen starten und die KW in der Spaltenüberschrift sehen wollen.

Code:
SELECT
   ARTIKEL.ARTIKEL_ID,
   SUM( case when ORDERS.DATUM between dateadd( week , -1 , current_date ) and dateadd( week , -0 , current_date ) then ORD_ARTIKEL.ARTIKEL_MENGE else 0 end ) AS Anz_1,
SUM( case when ORDERS.DATUM between dateadd( week , -2 , current_date ) and dateadd( week , -1 , current_date ) then ORD_ARTIKEL.ARTIKEL_MENGE else 0 end ) AS Anz_2,
SUM( case when ORDERS.DATUM between dateadd( week , -3 , current_date ) and dateadd( week , -2 , current_date ) then ORD_ARTIKEL.ARTIKEL_MENGE else 0 end ) AS Anz_3,
SUM( case when ORDERS.DATUM between dateadd( week , -4 , current_date ) and dateadd( week , -3 , current_date ) then ORD_ARTIKEL.ARTIKEL_MENGE else 0 end ) AS Anz_4,
SUM( case when ORDERS.DATUM between dateadd( week , -5 , current_date ) and dateadd( week , -4 , current_date ) then ORD_ARTIKEL.ARTIKEL_MENGE else 0 end ) AS Anz_5,
SUM( case when ORDERS.DATUM between dateadd( week , -6 , current_date ) and dateadd( week , -5 , current_date ) then ORD_ARTIKEL.ARTIKEL_MENGE else 0 end ) AS Anz_6,

FROM
   ORDERS
   INNER JOIN ARTIKEL
    ON ORDERS.ARTIKEL_ID = ARTIKEL.ARTIKEL_ID
WHERE
   ORDERS.Datum BETWEEN dateadd(week,-6,current_date)and dateadd(week,-1,current_date)
GROUP BY
   ARTIKEL.ARTIKEL_ID,

Sir Rufo 13. Jul 2015 12:00

AW: Abfrage mit dynamischen Spaltename
 
Ja, könnte man machen ... ist aber nicht ratsam ...

Besser wäre es doch, die Anzeige zu modifizieren. Dein DBGrid braucht doch lediglich ein
Delphi-Quellcode:
TDataSet
(welches ist dem völlig egal). Zur Not kannst du dem sogar ein
Delphi-Quellcode:
TClientDataSet
oder irgendein
Delphi-Quellcode:
TMemDataSet
unterjubeln.

Und in diesem DataSet kannst du dann die Spalten definieren und auf
Delphi-Quellcode:
Visible
setzen oder eben auch Delphi-Referenz durchsuchenData.DB.TField.DisplayLabel anpassen.

waldforest 13. Jul 2015 18:17

AW: Abfrage mit dynamischen Spaltename
 
Hallo,
vom Grunde her verstanden, mach ich auch schon in einigen Fällen.

Hintergrund der Dynaimisierung ist, das ich über einen separaten SQL-Bulder individuelle Auswertungen erstellen möchte, welche nicht hart im Code verankert sind. Diese möchte ich dann über einen Screen im Programm abrufen.
Dies können z.B. individuelle Statistikauswertungen sein. Aus diesem Grund wäre es ideal wenn ich den Spaltennamen als AS xxx dynamisch/über variable definieren kann.

Obiges war nur ein Beispiel.
Vielleicht geht dies, wie in Excel irgendwie mit PIVOT?? Damit habe ich bisher im SQL noch keine Erfahrung.

jobo 14. Jul 2015 07:16

AW: Abfrage mit dynamischen Spaltename
 
Wenn Du dynamisch SQL Statements erzeugst, hast Du doch die freie Wahl beim Feldnamen. Das bedeutet in Deinem Fall natürlich, dass innerhalb der Generierung des Statements die Werte für die Feldnamen abgefragt werden müssen.
Tatsächlich kannst Du in eingen RDBMS mit Pivotqueries arbeiten, die sind bezüglich der darzustellenden Pivotspalten aber auch nicht unbedingt dynamisch, sondern benötigen meist eine Angabe der Pivotspalten. In Firebird gibt es aber soweit ich weiß keine Pivotqueries.
Vielleicht benötigst Du einfach eine dynamische Feldnamenverwaltung, die Du zur Darstellung Deiner Abfrageergebnisse einsetzt? Also ein Mapping von Abfragen und deren originärer Feldnamen auf die gewünschten Displaywerte?

waldforest 14. Jul 2015 10:37

AW: Abfrage mit dynamischen Spaltename
 
Hallo,
danke, ist anscheinend nicht einfach in der SQL-Abfrage möglich
ich werde es jetzt so machen, dass ich nach Abfrage, die Spaltnnamen checke und austausche.
Vom Grunde her werden es Zeitangaben wie KW, Monat sein, welche ich nachbilde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz