Differenz zweier Felder

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Differenz zweier Felder

Re: Differenz zweier Felder

von Barlee » Fr, 06.11.2009 19:01

Hallo zummy,

ist jetzt nicht getestet. Probiere mal in der Art:

Code: Alles auswählen

SELECT Tab_A.* FROM
(
SELECT DISTINCT
"Kassenbuch"."DATUM",
"Kassenbuch"."ZWECK",
"Kassenbuch"."KASSE",
CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END - CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Betrag"
FROM "Kassenbuch" INNER JOIN "Kontostand" ON "Kassenbuch"."KASSE" = "Kontostand"."KONTO"
WHERE "Kassenbuch"."DATUM" > (SELECT MAX("Kontostand"."DATUM") FROM "Kontostand")
) "Tab_A",
(
(SELECT 
"Kontostand"."KONTO", 
MAX("Kontostand"."DATUM") AS "DATUM"
FROM "Kontostand"
GROUP BY "Kontostand"."KONTO"
) "Tab_B",
WHERE "Tab_A"."KASSE" = "Tab_B"."KONTO"
AND "Tab_A"."DATUM" > "Tab_B"."DATUM"
Gruß Barlee

Re: Differenz zweier Felder

von zummy » Do, 05.11.2009 23:13

Es klappt! Danke!! :D

Ein einziges Problem gibt es noch in dieser Abfrage:

Code: Alles auswählen

SELECT DISTINCT
"Kassenbuch"."DATUM",
"Kassenbuch"."ZWECK",
"Kassenbuch"."KASSE",
CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END - CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Betrag"
FROM "Kassenbuch" INNER JOIN "Kontostand" ON "Kassenbuch"."KASSE" = "Kontostand"."KONTO"
WHERE "Kassenbuch"."DATUM" > (SELECT MAX("Kontostand"."DATUM") FROM "Kontostand")
So, wie die Abfrage jetzt geschrieben ist, werden nur Datensätze ausgewählt, bei denen "DATUM" größer ist als das globale "DATUM" in der Tabelle "Kontostand".

Ich möchte aber, dass nicht das globale Maximum genommen wird, sondern das jeweilige Maximum von "DATUM" zu einem bestimmten Wert von "Kontostand"."KONTO". Habe ich das einigermaßen verständlich ausgedrückt?

Re: Differenz zweier Felder

von Barlee » Do, 05.11.2009 20:24

verwendeten Abfrage "a_1_Ergebnis_unter":
Aha! Du hast eine Abfrage, die Du unter dem Namen der Abfrage erneut abfragst, korrekt?
Das kann nicht funktionieren!

1) Entweder verschachtelst Du die Abfrage, wie ich es weiter oben beispielhaft geschildert habe (also in einem SQL Block) oder
2) Du erstellst aus der Abfrage "a_1_Ergebnis_unter" eine Ansicht (View). Darauf kannst Du dann wie auf eine Tabelle zugreifen. >> rechte Maustaste auf die Abfrage >> als Ansicht erstellen >> Namen vergeben. Diesen Namen kannst Du dann in Deiner Abfrage als Tabellennamen einsetzen.

Gruß Barlee

Re: Differenz zweier Felder

von zummy » Do, 05.11.2009 19:46

Nein, ich habe wirklich alles überprüft. Keine versteckten Leerzeichen.

Hier einmal der Code der verwendeten Abfrage "a_1_Ergebnis_unter":

Code: Alles auswählen

SELECT
"a_4_aktuellster_kontostand"."KONTO",
"a_4_aktuellster_kontostand"."KONTOSTAND",
"a_2_Summe"."SUMME"
FROM { OJ "a_2_Summe" AS "a_2_Summe" RIGHT OUTER JOIN "a_4_aktuellster_kontostand" AS "a_4_aktuellster_kontostand" ON "a_2_Summe"."KASSE" = "a_4_aktuellster_kontostand"."KONTO" }
Diese Abfrage funktioniert wunderbar.

Eine alternative Lösung meines Problems wäre, wenn ich es hinbekommen würde, in der Spalte "a_1_Ergebnis_unter"."SUMME" immer dann, wenn jetzt der Wert NULL dort steht, eine 0 einzutragen. Aber auch das gelingt mir nicht...

Re: Differenz zweier Felder

von Barlee » Do, 05.11.2009 19:08

Hey zummy,

Syntax ist ok mit IS NOT NULL. Daran kann's nicht liegen.

Hast Du am Tabellennamen irgendwo ein Leerzeichen hinten oder vorne?
Schau nochmal nach unter Tabelle/umbenennen, ob sich ein solches dort versteckt.

Das sollte am Namen liegen. Irgendwo ist da eine Abweichung...

Gruß Barlee

Re: Differenz zweier Felder

von zummy » Do, 05.11.2009 18:38

pmoegenb hat geschrieben:Hallo Zimmy,
auf die Schnelle ist die nachfolgende Syntax in jedem Fall fehlerhaft

IS NOT NULL

Stattdessen müsste es heißen

Code: Alles auswählen

NOT Feldname IS NULL
Das hat leider nichts geändert.

Die Tabellen- und Spaltennamen sind (incl. Groß-/Kleinschreibung) alle richtig.

Re: Differenz zweier Felder

von Barlee » Do, 05.11.2009 17:56

Hallo zummy,

Groß-/ Kleinschreibung der Spalten und Tabellennamen ist korrekt?
Kontrolliere das nochmal.

Gruß Barlee

Re: Differenz zweier Felder

von pmoegenb » Do, 05.11.2009 13:12

Hallo Zimmy,
auf die Schnelle ist die nachfolgende Syntax in jedem Fall fehlerhaft

IS NOT NULL

Stattdessen müsste es heißen

Code: Alles auswählen

NOT Feldname IS NULL

Re: Differenz zweier Felder

von zummy » Do, 05.11.2009 00:27

Vielen Dank, jetzt klappt alles :)

Ein kleines Problem stellt sich jetzt noch. Wo ist der Fehler in diesem Code?

Code: Alles auswählen

SELECT
"a_1_Ergebnis_unter"."KONTO",
"a_1_Ergebnis_unter"."KONTOSTAND" + CASE WHEN "a_1_Ergebnis_unter"."SUMME" IS NOT NULL THEN "a_1_Ergebnis_unter"."SUMME" ELSE 0 END AS "AKTUELL"
FROM "a_1_Ergebnis_unter" AS "a_1_Ergebnis_unter"
Die Fehlermeldung lautet:
Table not found in statement [...
Die Tabellen und Spalten exisitieren aber alle. Und das Häkchen bei "SQL-Kommando direkt ausführen" ist auch gesetzt...

Re: Differenz zweier Felder

von Barlee » So, 01.11.2009 17:36

Hallo zummy,

geht doch voran ...
Ich bekomme es aber nicht hin, die Ergebnisse von "Ausdr2" und "Ausdr3" dort zu verwenden.
Die Bezeichner "Ausdr2" und "Ausdr3" könntest Du erst in einem äußeren SELECT verwenden. Beispiel

Code: Alles auswählen

SELECT 
Spalte_A, 
Spalte_B, 
Spalte_A + Spalte_B AS Spalte_C
FROM Tab_1
Für das Ergebnis von Spalte_A + Spalte_B vergibst Du in voriger Abfrage den Alias "Spalte_C".
Führst Du die Abfrage aus, bekommst Du also eine Ergebnistabelle mit den Spalten "Spalte_A", "Spalte_B", "Spalte_C" zurück.
Fragst Du dieses Ergebnis erneut ab, kannst Du jetzt direkt den Alias angeben:

Code: Alles auswählen

SELECT a.Spalte_C FROM
(
SELECT 
Spalte_A, 
Spalte_B, 
Spalte_A + Spalte_B AS Spalte_C
FROM Tab_1
) a
In Deinem Fall musst Du somit statt

Code: Alles auswählen

"Ausdr2" - "Ausdr3" AS "Betrag"

folgendes verwenden:

Code: Alles auswählen

CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END - CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Betrag"
---
Wenn Du nur doppelte Einträge ausfiltern/vermeiden möchtest, dann sollte ein DISTINCT genügen.

Code: Alles auswählen

SELECT DISTINCT ...
Gruß Barlee

Re: Differenz zweier Felder

von zummy » So, 01.11.2009 16:08

Hallo barlee,

vielen Dank für deine Hilfe!

Jetzt funktioniert es schon fast:

Code: Alles auswählen

SELECT
SELECT
"Kassenbuch"."DATUM", "Kassenbuch"."ZWECK", "Kassenbuch"."KASSE",
CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END AS "Ausdr2",
CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Ausdr3",
CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END - CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Betrag"
FROM "Kassenbuch" INNER JOIN "Kontostand" ON "Kassenbuch"."KASSE" = "Kontostand"."KONTO"
WHERE "Kassenbuch"."DATUM" > (SELECT MAX("Kontostand"."DATUM") FROM "Kontostand")
Die Definitionen von "Ausdr2" und "Ausdr3" sind jetzt offenbar überflüssig, bzw. wird dieselbe CASE-Funktion bei "Betrag" nochmal ausgeführt. Ich bekomme es aber nicht hin, die Ergebnisse von "Ausdr2" und "Ausdr3" dort zu verwenden.

Code: Alles auswählen

"Ausdr2" - "Ausdr3" AS "Betrag"
funktioniert nicht. Ist aber nicht weiter schlimm, ich kann "Ausdr2" und "Ausdr3" ja einfach streichen.

Jetzt fehlt tatsächlich nur noch die Gruppierung. Im Moment taucht in der Abfrage jeder Datensatz so oft auf, wie der zugehörige Wert aus "Kassenbuch"."KASSE" in "Kontostand"."KONTO" auftaucht. Jedoch soll jeder Datensatz nur einmal in der Abfrage auftauchen. Wie formuliere ich diese Gruppierung und an welcher Stelle kommt sie in den Code? Diverse Versuche waren leider erfolglos.

Re: Differenz zweier Felder

von Barlee » Sa, 31.10.2009 14:53

eine Funktionsübersicht findest Du z.B. hier
http://wiki.services.openoffice.org/wik ... Procedures
Wann setze ich eckige Klammern um Felder und wann Anführungszeichen? Ist das äquivalent?
Du setzt immer Anführungszeichen. Und zwar um alle Tabellennamen, Spaltenbezeichner, Aliase. Bei Verwendung von z.B. CASE WHEN musst Du zusätzlich noch unter "Bearbeiten" >> "SQL Kommando direkt ausführen" aktivieren
---

Dein SQL kann also schon aus dem Grund nicht funktionieren. Auch musst Du CASE WHEN in die GROUP BY Klausel übernehmen. IIF gibt es nunmal nicht in OOBase. Und CASE WHEN schließt mit END ab. Auch das fehlt.
Zu welcher Tabelle gehören "Einnahme" und "Ausgabe"? Zu "Kontostand" oder zu "Kassenbuch"? Das geht aus Deinem SQL nicht hervor.
Daher kannst Du folgendes auch nur als Beispiel betrachten:

Code: Alles auswählen

SELECT 
"Kassenbuch"."Datum", "Kassenbuch"."Zweck", "Kassenbuch"."Kasse",
CASE WHEN "Einnahme" IS NOT NULL THEN "Einnahme" ELSE 0 END AS "Ausdr2",
CASE WHEN "Ausgabe" IS NOT NULL THEN "Ausgabe" ELSE 0 END AS "Ausdr3",
CASE WHEN "Einnahme" IS NOT NULL THEN "Einnahme" ELSE 0 END - CASE WHEN "Ausgabe" IS NOT NULL THEN "Ausgabe" ELSE 0 END AS "Betrag"
FROM "Kassenbuch" INNER JOIN "Kontostand" ON "Kassenbuch"."Kasse" = "Kontostand"."Konto"
WHERE "Kassenbuch"."Datum" > (SELECT MAX("Kontostand"."Datum") FROM "Kontostand")
Gruß Barlee

Re: Differenz zweier Felder

von zummy » Sa, 31.10.2009 12:35

Dies ist mein nächster Versuch. Der Fehler bleibt derselbe.

Code: Alles auswählen

SELECT Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, 
CASE WHEN "Einnahme" IS NOT Null THEN "Einnahme" ELSE 0 AS Ausdr2, 
CASE WHEN "Ausgabe" IS NOT Null THEN "Ausgabe" ELSE 0 AS Ausdr3, 
[Ausdr2]-[Ausdr3] AS Betrag
FROM Kassenbuch INNER JOIN Kontostand ON Kassenbuch.Kasse = Kontostand.Konto
GROUP BY Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, IIf([Einnahme] Is Not Null,[Einnahme],0), IIf([Ausgabe] Is Not Null,[Ausgabe],0)
HAVING (((Kassenbuch.Datum)>Max([kontostand].[datum])));
Wann setze ich eckige Klammern um Felder und wann Anführungszeichen? Ist das äquivalent?

Ich kenne mich leider nicht gut mit SQL aus. Ich dachte immer, SQL-Syntax wäre überall gleich. Aber stattdessen lauten die Befehle in Access anders als in OOo Base? Finde ich irgendwo eine Übersicht? Meine Recherche war leider erfolglos.

Re: Differenz zweier Felder

von Barlee » Di, 27.10.2009 19:21

Hey zummy,

"Iif" ist Access Syntax. Nimm stattdessen CASE ... WHEN ... THEN ... END.
Dazu gibt es hier im Forum schon eine Menge Beispiele.

Gruß Barlee

Re: Differenz zweier Felder

von zummy » Di, 27.10.2009 14:58

Ich dachte, da:

Code: Alles auswählen

IIf([Einnahme] Is Not Null,[Einnahme],0) AS Ausdr2, IIf([Ausgabe] Is Not Null,[Ausgabe],0) AS Ausdr3
Jedenfalls habe ich es jetzt wie folgt umgestellt:

Code: Alles auswählen

SELECT Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, Ausdr2 := IIf([Einnahme] Is Not Null,[Einnahme],0), Ausdr3 := IIf([Ausgabe] Is Not Null,[Ausgabe],0), [Ausdr2]-[Ausdr3] AS Betrag
FROM Kassenbuch INNER JOIN Kontostand ON Kassenbuch.Kasse = Kontostand.Konto
GROUP BY Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, IIf([Einnahme] Is Not Null,[Einnahme],0), IIf([Ausgabe] Is Not Null,[Ausgabe],0)
HAVING (((Kassenbuch.Datum)>Max([kontostand].[datum])));
Der Fehler bleibt leider der gleiche:
Syntax error in SQL expression

Nach oben