Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Union Select und group by Problem (https://www.delphipraxis.net/145866-union-select-und-group-problem.html)

verkouter 9. Jan 2010 19:35

Datenbank: Paradox • Zugriff über: ODBX

Union Select und group by Problem
 
Ich habe eine Tabelle in der gibt es 14 Felder für eine Leistungsverzeichnisnummer,14 Felder für eine
Bezeicchnung,14 Felder für Einheit und 14 Felder füt Menge.
Jeder Datensatz steht für einen Tag in einem Bautagebuch.Ich arbeite das erste Mal mit
Query und SQL-Abfragen. In dem Programm soll es eine Seite geben die mir die Leistungen addiert.

Delphi-Quellcode:
with Query1.SQL do
begin
Clear;
Add('SELECT lvn1,be1,ein1,me1');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn2,be2,ein2,me2');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn3,be3,ein3,me3');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn4,be4,ein4,me4');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn5,be5,ein5,me5');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn6,be6,ein6,me6');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn7,be7,ein7,me7');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn8,be8,ein8,me8');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn9,be9,ein9,me9');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn10,be10,ein10,me10');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn11,be11,ein11,me11');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn12,be12,ein12,me12');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn13,be13,ein13,me13');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn14,be14,ein14,me14');
Add('FROM "' + Datei + '" ');
end;
Query1.Open;
Mit diesen Code fülle ich ein Query.Ich bekomme es aber nicht hin,dass er mir die Bezeichnung(be)
gruppiert und von der Menge(me)die summe bildet.

mkinzler 9. Jan 2010 19:40

Re: Union Select und group by Problem
 
Villeicht solltest du mit Aliasen dafür sorgen, dass er auch was zu gruppieren hat

SQL-Code:
  SELECT
    lvn1 as lvn, be1 as b1, ein1 as ein, me1 as m3

UNION
  SELECT
    lvn2 as lvn, be2 as be, ein2 as ein, me2 as me
...

verkouter 9. Jan 2010 21:05

Re: Union Select und group by Problem
 
Jetzt bekomme ich die Fehlermeldung "ungültiger Feldname".

Delphi-Quellcode:

Add('SELECT lvn1 as Nummer,be1 as Be,ein1 as Einheit,me1 as Menge');
Add('FROM "' + Datei + '" ');
.
.
.
Add('union SELECT lvn14 as Nummer,be14 as Be,ein14 as Einheit,me14 as Menge');
Add('FROM "' + Datei + '" ');
add('group by Be');
Und wie kann ich noch die Summen berechnen?

Sir Rufo 9. Jan 2010 21:59

Re: Union Select und group by Problem
 
- in eine eigene (temporäre) tabelle überführen und dann mit group dran
- ein view erzeugen und darüber mit group

aber das geht mE nicht mit paradox

Jürgen Thomas 10. Jan 2010 10:43

Re: Union Select und group by Problem
 
Hallo,

die Alias-Namen des ersten SELECT gelten für alle anderen. Du darfst sie also nur beim ersten SELECT aufführen.

Zur Gruppierung und Summierung kannst du die UNION-Konstruktion als Tabelle für einen weiteren SELECT benutzen:
SQL-Code:
SELECT Be, SUM(Menge) FROM
   ( SELECT ... UNION ... SELECT )
GROUP BY Be;
Vorausgesetzt, das geht bei Paradox.

Gruß Jürgen

verkouter 10. Jan 2010 13:01

Re: Union Select und group by Problem
 
Wie gesagt,ich habe noch keine Ahnung von SQL-Abfragen.Habe schon nach ähnlichen Quelltext
gesucht um die Abfrage zu verstehen.

Habe meinen Quellcode abgeändert.
Delphi-Quellcode:
with Query1.SQL do
begin
Clear;
add('Select Bezeichnung,Sum(Menge) from');
Add('(SELECT lvn1 as Nummer,be1 as Bezeichnung,ein1 as Einheit,me1 as Menge');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn2,be2,ein2,me2');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn3,be3,ein3,me3');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn4,be4,ein4,me4');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn5,be5,ein5,me5');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn6,be6,ein6,me6');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn7,be7,ein7,me7');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn8,be8,ein8,me8');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn9,be9,ein9,me9');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn10,be10,ein10,me10');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn11,be11,ein11,me11');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn12,be12,ein12,me12');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn13,be13,ein13,me13');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn14,be14,ein14,me14');
Add('FROM "' + Datei + '" )');
add('group by Bezeichnung');
Und bekomme jetzt als Fehlermeldung

Ungültiges Schlüsselwort Symbol-String:SELECT

Jürgen Thomas 10. Jan 2010 13:13

Re: Union Select und group by Problem
 
Das deutet darauf hin, dass diese Konstruktion tatsächlich unter Paradox mit ODBX nicht zulässig ist (vorausgesetzt, du hast die Klammern richtig gesetzt, aber es sieht eigentlich danach aus).

Dann möchte ich den Vorschlag von Sir Rufo aufgreifen, das Ergebnis der UNION-Konstruktion in einer temp. Tabelle zu speichern und diese auszuwerten.

Brauchst du eigentlich bei deinen Tabellen die ständigen Gänsefüßchen? "Ohne" wäre es übersichtlicher.

Siehe auch [wikibooks] Einführung in SQL, auch wenn all das bei dem konkreten Problem nicht hilft.

Gruß Jürgen

verkouter 10. Jan 2010 13:58

Re: Union Select und group by Problem
 
Wie lege ich denn eine virtuelle Tabelle an?

Sir Rufo 10. Jan 2010 14:05

Re: Union Select und group by Problem
 
Ist zwar keine Lösung für dein Problem, aber lade doch das Skript aus einer Datei ...
Datei "MeinSelect.sql":
Code:
SELECT lvn1 as Nummer,be1 as Bezeichnung,ein1 as Einheit,me1 as Menge
FROM "{Datei}"
union
SELECT lvn2,be2,ein2,me2
FROM "{Datei}"
union
SELECT lvn3,be3,ein3,me3
FROM "{Datei}"
und dann
Delphi-Quellcode:
SQL.LoadFromFile( 'MeinSelect.sql' );
SQL.Text := StringReplace( SQL.Text, '{Datei}', Datei, [ rfReplaceAll ] );
Wie du siehst, verkürzt das den Quelltext ungemein, und du kannst den Select ändern,
ohne ständiges Neucompilieren.

sx2008 10. Jan 2010 14:11

Re: Union Select und group by Problem
 
Zitat:

Zitat von verkouter
Ich habe eine Tabelle in der gibt es 14 Felder für eine Leistungsverzeichnisnummer,14 Felder für eine
Bezeicchnung,14 Felder für Einheit und 14 Felder füt Menge.

Eigentlich fängt hier schon das Problem an. Die Datenbank ist nicht in der 3. Normalform!

verkouter 10. Jan 2010 15:53

Re: Union Select und group by Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Normalisierung hatte ich schon probiert.Habe meine Tabelle in drei Tabellen zerlegt.

Haupttabelle
Id
Datum
Stunden
Geräte

Leistungstabelle
LV-Nummer
Bezeichnung
Menge
Einheit

Baustoffe
Bezeichnung
Menge
Einheit

Hatte soweit auch prima geklappt.Auch in der Leistungsansicht Group by und Summierung.
Allerdings soll die Eingabemaske so erhalten bleiben.
Mir ist dann nicht gelungen den Dbcomboboxen für Leistungen die Werte zuzuweisen.

sx2008 10. Jan 2010 16:46

Re: Union Select und group by Problem
 
Deine Leistungstabelle hat ja gar keinen Bezug zur Haupttabelle.
Die Tabelle braucht einen Fremdschlüssel, der die Verbindung zur Haupttabelle herstellt.

Haupttabelle
Id
Datum
Stunden
Geräte

Leistungstabelle
Id (Primärschlüssel)
IdHaupttab (Fremdschlüssel auf Haupttabelle)
IdEinsatz
LV-Nummer
Bezeichnung
Menge
Einheit

Für die Leistungstabelle würde ich an deiner Stelle auch keine einzelnen Edit- oder Combofelder verwenden,
sondern gleich ein DBGrid verwenden.
Damit bleibt auch die Anzahl der Leistungen nach oben unbegrenzt. (also mehr als 14 Stück möglich)

verkouter 10. Jan 2010 16:55

Re: Union Select und group by Problem
 
Doch die Verbindung mit einem Schlüssel war hergestellt,habe ich vergessen.
Die Eingabemaske soll auf alle Fälle so erhalten bleiben.Keine Verwendung von DBgrid.

Sir Rufo 10. Jan 2010 17:12

Re: Union Select und group by Problem
 
Dann versuch es doch mit einem TDBCtrlGrid

verkouter 10. Jan 2010 18:43

Re: Union Select und group by Problem
 
Mit TDBCtrlGrid hatte ich bis jetzt noch nie gearbeitet, ich habs ausprobiert,und zu Anzeige der
Datensätze funktioniert es.Aber ich habe keine Möglichkeit darin einen Datensatz hinzuzufügen.
Oder doch???

Und das nächste Problem ist,das die Felder meiner jetzigen Eingabemaske nach Excel exportiert
werden.

Sir Rufo 10. Jan 2010 18:54

Re: Union Select und group by Problem
 
Zitat:

Zitat von verkouter
Mit TDBCtrlGrid hatte ich bis jetzt noch nie gearbeitet, ich habs ausprobiert,und zu Anzeige der
Datensätze funktioniert es.Aber ich habe keine Möglichkeit darin einen Datensatz hinzuzufügen.
Oder doch???

Und das nächste Problem ist,das die Felder meiner jetzigen Eingabemaske nach Excel exportiert
werden.

öh, du willst doch 14 Eingabe-Gruppen haben ... die legst du an und kannst diese dann mit dem Grid bearbeiten.
Das ist doch ein Vorschlag zum Normalisieren.

Mit der Compo kann man auch Datensätze anfügen aber in deinem Fall würde ich das auf jeden Fall ausschließen.

verkouter 10. Jan 2010 19:31

Re: Union Select und group by Problem
 
Habe jetzt mehrere TDBCtrlGrid Versuche mit DBCtrlGrid durchgeführt.Als erstes habe ich eine
DBcomboboxhinzugefügt, bei drei Leistungen am Tag zeigt er mir dann auch 3 DBcomboboxen mit den
Leistungen an.Ich habe dann aber keine leeren Comboboxen für zusätzliche Leistungen.Füge ich
allerdings schon 14 DBcomboboxen ein und ich habe 3 Leistungen zeigt er mit 3x14 DBcomboboxen an.

Sir Rufo 10. Jan 2010 20:10

Re: Union Select und group by Problem
 
öh, hast du die db denn schon normalisiert?

verkouter 10. Jan 2010 20:18

Re: Union Select und group by Problem
 
Ja ich habe im Moment zwei Programmversionen.Würden am liebsten die große Tabelle behalten,und
das irgendwie mit dieser virtuellen Tabelle hinbekommen.Habe jetzt mal mit
Query.sql.add('create view Leistung as') rumexperimentiert, bekomme aber auch nur Fehlermeldungen.
Habe halt von SQL-Abfragen keine Ahnung.

mkinzler 10. Jan 2010 20:24

Re: Union Select und group by Problem
 
Zitat:

Würden am liebsten die große Tabelle behalten
Das wäre aber die mit Abstand schlechtere Lösung

Sir Rufo 10. Jan 2010 21:36

Re: Union Select und group by Problem
 
Zitat:

Zitat von verkouter
Habe jetzt mal mit
Query.sql.add('create view Leistung as') rumexperimentiert, bekomme aber auch nur Fehlermeldungen.
Habe halt von SQL-Abfragen keine Ahnung.

Das wirst du mit paradox auch schwerlich hinbekommen ...

nahpets 11. Jan 2010 09:44

Re: Union Select und group by Problem
 
Hallo,

ob Paradox mit geschachtelten Selects zurechtkommt, weiß ich nicht, aber wenn, so sind im folgenden syntaktische Fehler:
Zitat:

Zitat von verkouter
Wie gesagt,ich habe noch keine Ahnung von SQL-Abfragen.Habe schon nach ähnlichen Quelltext
gesucht um die Abfrage zu verstehen.

Habe meinen Quellcode abgeändert.
Delphi-Quellcode:
with Query1.SQL do
begin
Clear;
add('Select Bezeichnung,Sum(Menge) from ('); // <-- öffnende Klammer fehlte
Add('(SELECT lvn1 as Nummer,be1 as Bezeichnung,ein1 as Einheit,me1 as Menge');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn2,be2,ein2,me2');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn3,be3,ein3,me3');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn4,be4,ein4,me4');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn5,be5,ein5,me5');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn6,be6,ein6,me6');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn7,be7,ein7,me7');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn8,be8,ein8,me8');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn9,be9,ein9,me9');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn10,be10,ein10,me10');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn11,be11,ein11,me11');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn12,be12,ein12,me12');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn13,be13,ein13,me13');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn14,be14,ein14,me14');
Add('FROM "' + Datei + '" ) Aliasname '); // <-- Je nach SQL-Dialekt muss hier ein Aliasname angegeben werden
add('group by Bezeichnung');
Und bekomme jetzt als Fehlermeldung

Ungültiges Schlüsselwort Symbol-String:SELECT


Jürgen Thomas 11. Jan 2010 09:51

Re: Union Select und group by Problem
 
Zitat:

Zitat von nahpets
// <-- öffnende Klammer fehlte

Ach, wenn es doch so einfach wäre. Das hatte ich vor einigen Beiträgen auch schon untersucht, aber diese Klammer kommt am Anfang der nächsten Zeile. Jürgen

nahpets 11. Jan 2010 09:58

Re: Union Select und group by Problem
 
Hallo,
Zitat:

Zitat von Jürgen Thomas
Zitat:

Zitat von nahpets
// <-- öffnende Klammer fehlte

Ach, wenn es doch so einfach wäre. Das hatte ich vor einigen Beiträgen auch schon untersucht, aber diese Klammer kommt am Anfang der nächsten Zeile. Jürgen

oh stimmt, (mit Brille wäre das nicht passiert ;-)). Daraus können wir schließen: Paradox und geschachtelte Select geht nicht.

verkouter 11. Jan 2010 14:09

Re: Union Select und group by Problem
 
Ich habe mich jetzt doch für die normalisierte Tabelle entschieden. Wenn ein neuer
Datensatz in der Haupttabelle angelegt wird, lege ich 14 leere Datensätze in der Leistungstabelle
an,dammit funktionierte es jetzt auch mit der DBctrlgrid.

Vielen Dank für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 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