Seite 1 von 1

[gelöst] Abfrage: Summenbildung für verschiedene Bedingungen in einer Tabelle - Cross Join?

Verfasst: Do 8. Sep 2016, 11:21
von EinsamerBaumWald
Hallo,

ich habe folgende Abfrage

Code: Alles auswählen

SELECT "Kraut", SUM( "Gewicht" ) AS "GesamtGewicht", COUNT( "Kraut" ) AS "Anzahl", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht" FROM "Kräuter" WHERE "verkauft" = 0 AND  YEAR("Chargennummer") = 2015 GROUP BY "Kraut" ORDER BY "Kraut" ASC
und würde jetzt gerne die Spalten für die Bedingung
YEAR("Chargennummer") = 2016
hinzufügen. Das sollte ja mit JOIN funktionieren, aber ich bekomme immer nur Fehlermeldungen.

Probiert habe ich z.B.

Code: Alles auswählen

SELECT "Kraut", SUM( "Gewicht" ) AS "GesamtGewicht", COUNT( "Kraut" ) AS "Anzahl", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht" FROM "Kräuter" as "15" WHERE "verkauft" = 0 AND  YEAR("Chargennummer") = 2015 GROUP BY "15"."Kraut" 
CROSS JOIN
(
SELECT SUM( "Gewicht" ) AS "GesamtGewicht 16", COUNT( "Kraut" ) AS "Anzahl 16", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht 16" FROM "Kräuter" AS "16" WHERE "verkauft" = 0 AND  YEAR("Chargennummer") = 2016 GROUP BY "16"."Kraut"
)
Die Fehlermeldung
SQL-Status: HY000
Fehler-Code: 1000

syntax error, unexpected $end, expecting BETWEEN or IN or SQL_TOKEN_LIKE
hilft mir nicht weiter.

Irgendwie stehe ich gerade auf dem Schlauch.
Wer kann mir weiterhelfen?
Vielen Dank!

Die Datenbank ist diese hier: http://libreoffice-forum.de/download/file.php?id=4408

Re: Abfrage: Summenbildung für verschiedene Bedingungen in einer Tabelle - Cross Join?

Verfasst: Do 8. Sep 2016, 12:13
von EinsamerBaumWald
Mit UNION kann ich beide Select-Statements verbinden, dann hätte ich auch alle Angaben "auf einer Seite". Aber untereinander statt nebeneinander.

Code: Alles auswählen

(
SELECT "Kraut",YEAR(now())-1 as "Erntejahr", SUM( "Gewicht" ) AS "GesamtGewicht", COUNT( "Kraut" ) AS "Anzahl", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht" FROM "Kräuter"  WHERE "verkauft" = 0 AND YEAR("Chargennummer") = YEAR(now())-1 GROUP BY "Kraut" )

UNION

(
SELECT "Kraut", YEAR(now()) as "Erntejahr", SUM( "Gewicht" ) AS "GesamtGewicht 16", COUNT( "Kraut" ) AS "Anzahl 16", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht 16" FROM "Kräuter" WHERE "verkauft" = 0 AND  YEAR("Chargennummer") = YEAR(now()) GROUP BY "Kraut"
)
ORDER BY "Erntejahr"
Funktioniert aber nur, wenn im Fenster Abfrageentwurf im Menü Bearbeiten -> SQL-Kommando direkt ausführen angehakt ist.

Re: Abfrage: Summenbildung für verschiedene Bedingungen in einer Tabelle - Cross Join?

Verfasst: Do 8. Sep 2016, 17:38
von RobertG
Hallo EinsamerBaumWald,

wenn Du zwei Tabellen mit einer Abfrage (auch mit einem Join jeglicher Art) verknüpfst, so erhältst nicht eine Abbildung gleichlautender Felder nebeneinander. Stattdessen begrenzt oder erweiterst Du die Anzahl der anzuzeigenden Datensätze.
Aus dem Handbuch:
Beim CROSS JOIN müssen auf jeden Fall die Tabellen mit einem Aliasnamen versehen werden, wobei das Hinzufügen des Begriffes AS nicht unbedingt notwendig ist. Es werden einfach alle Datensätze aus der ersten Tabelle mit allen Datensätzen der zweiten Tabelle gekoppelt. So
ergibt die obige Abfrage alle möglichen Paarungen aus der ersten Tabelle mit denen aus der zweiten Tabelle mit Ausnahme der Paarungen, bei denen es sich um gleiche Spieler handelt. Die Bedingung darf beim CROSS JOIN allerdings keine Verknüpfung der Tabellen mit ON enthalten. Stattdessen können unter WHERE Bedingungen eingegeben werden.
Du erzeugst so also nicht Felder nebeneinander sondern alle möglichen Koppelungen der betroffenen Tabellen. Du vervielfachst also die Datensätze.

Die folgende Technik dürfte für Dich zielführender sein:

Code: Alles auswählen

SELECT "a".*, "b".* FROM (SELECT "Kraut", SUM( "Gewicht" ) AS "GesamtGewicht", COUNT( "Kraut" ) AS "Anzahl", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht" FROM "Kräuter" WHERE "verkauft" = 0 AND  YEAR("Chargennummer") = 2015 GROUP BY "Kraut") AS "a" LEFT JOIN (SELECT "Kraut", SUM( "Gewicht" ) AS "GesamtGewicht", COUNT( "Kraut" ) AS "Anzahl", SUM( "Gewicht" ) / COUNT( "Kraut" ) AS "Durchschnittsgewicht" FROM "Kräuter" WHERE "verkauft" = 0 AND  YEAR("Chargennummer") = 2016 GROUP BY "Kraut") AS "b" ON "a"."Kraut" = "b"."Kraut"
Gruß

Robert

Re: Abfrage: Summenbildung für verschiedene Bedingungen in einer Tabelle - Cross Join?

Verfasst: Do 8. Sep 2016, 20:12
von EinsamerBaumWald
Hallo Robert,

herzlichen Dank für Deine Mühe!
Das ist, was ich ursprünglich suchte.

Ich habe erst vor kurzem begonnen mich mit LO Base und SQL zu beschäftigen und habe sicher noch nicht alles durchdrungen, manche Konzepte sind noch ungewohnt für mich. Da ist es sehr nett, wenn man andere Menschen um Rat fragen kann, wenn man nach dem Durchblättern von 10 Seiten Suchergebnissen (und Lesen der Links) keine Antwort auf seine Frage gefunden hat.

Nachdem ich die Abfrage mit UNION nun schon einige Male verwendet habe, sagt mir diese Darstellung der Daten doch mehr zu…

Grüße,
EinsamerBaumWald