Teilsumme nach Datum erzeugen

Lars Eberhardt

Benutzer
Beiträge
5
Hallo zusammen,

ich könnte Hilfe benötigen für folgenden Fall:

Tabelle (Tab1)
-----------------------
Name |Datum |Summe h
----------------------------------------------------------

Peter |23.01.2019 |4.5
Peter |26.01.2020 |5.0
Hanna |25.02.2019 |4.5
Hanna |25.02.2020 |4.5
Peter |01.01.2020 |2.25
Hanna |19.08.2020 |4.25

Mein Endergebnis soll die nach Jahren und nach Mitarbeiter gruppierte Summe sein:

Tabelle (Ergebnis)
-----------------------
Name |2019 sum |2020 sum
-----------------------------------------------------------

Peter |4.5 |7.25
Hanna |4.5 |8.75

Ich habe nach Hilfe in diversen Foren gesucht und vielleicht auch schon die Lösung gefunden, bin dann aber nicht in der Lage diese anzuwenden, daher poste ich die Frage hier nochmal. Ich habe in meinem Programm (BI Tool mit SQL Abfragelogik) keinen Debugger etc. und sehe leider nur das Ergebnis oder einen Fehler ohne Details. Ich dachte zuerst ich mach in der Select einfach zwei sum Funktionen und filter die jeweils nach dem Jahr mit where, das klappt aber nicht bekomme ich einen Syntaxfehler ich denke das liegt am Gruppieren. Ich habe dann schon herausgefunden, dass ich vermutlich für jedes Jahr eine Spalte benötige wie im Ergebnisvorschlag dargestellt, hierzu habe ich verschiedene Artikel über Kreuztabellen gelesen und naja ebenfalls Syntaxfehler :( . Später habe ich Ähnliches gesehen mit Subselects aber da waren die Beispiele nicht wirklich schön erklärt und ich bin ausgestiegen, auch weil die Lösung irgendwie gar nicht meinem Denken entspricht ich will das irgendwie intuitiv lösen mit einer gefilterten Selectabfrage. Hier liegt eventuell aber der nächste Fehler, weil meine Intuition hier vielleicht auf dem Holzweg ist. To cut a long story short:
Also sorry, dass ich eine vermutlich so einfache Frage stelle, aber ich komme wirklich nicht weiter und der Lerneffekt vom "Doing your self" ist nach zwei Tagen purem Frust gewichen :( .

Für eine Lösung mit Erklärung wäre ich sehr dankbar!

Gruß


Lars
 
Werbung:
Code:
test=*# select * from lars_eberhardt ;
 name  | jahr | wert
-------+------+------
 peter | 2019 |  4.5
 peter | 2020 |  5.0
 hanna | 2019 |  4.5
 hanna | 2020 |  4.5
 peter | 2020 | 2.25
 hanna | 2020 | 4.25
(6 rows)

test=*# select name, sum(wert) filter (where jahr = 2019) as "Summe_2019", sum(wert) filter (where jahr = 2020) as "Summe_2020" from lars_eberhardt group by name;
 name  | Summe_2019 | Summe_2020
-------+------------+------------
 peter |        4.5 |       7.25
 hanna |        4.5 |       8.75
(2 rows)

test=*#

Ist jetzt vereinfacht (kein Datum, sondern nur das Jahr als INT) und mit PostgreSQL, aber ich glaube, die Filter-Syntax kann auch MS-SQL. Müßte noch umgeschrieben werden daß das Jahr aus dem Datum extrahiert und als Filter-Kriterium gilt.
 
Hallo Akretschmer,

zunächst vielen Dank für die super schnelle Antwort, irgendwie haut es bei mir noch nicht hin, ich muss einen Fehler irgendwo stecken haben:


SELECT
"TIME_PROPERTIES für USER"."USR_NAME.NAME",
"TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date",
sum("TIME_PROPERTIES für USER"."TIME_PROPERTIES.QTY") where ("TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date") = '2019',
sum("TIME_PROPERTIES für USER"."TIME_PROPERTIES.QTY") where ("TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date") = '2020'
FROM "TIME_PROPERTIES für USER"
WHERE "TIME_PROPERTIES für USER"."USR_NAME.NAME" like '%DUS%'
GROUP BY "TIME_PROPERTIES für USER"."USR_NAME.NAME"

PS: ohne die sum Spalte und die Group by Spalte funktioniert es, einwandfrei also liegt der Fehler entweder in Zeile 4 bzw. 5 oder in 8. Ich denke 5 lässt sich ausschließen, ich habe auch schon 100 Varianten mit verschiedenen Klammern für die Sum Formeln mit der Where Klausel probiert. Das Datum ist schon akkreditiert habe ich in der Ursprungstabelle gemacht.
 
ja, die Syntax ist ja auch:

Code:
sum(wert) filter (where jahr = 2019)

Das FILTER (WHERE ...) ist wichtig, bei Dir 'sieht' der Parser nun mehrfach ein WHERE - was halt falsch ist. Ich weiß aber nicht, ob M$SQL schon weit genug ist, dieses SQL-Feature zu können.
 
Hallo Akretschmer,

das habe ich schon befürchtet bei mir springt das filter nicht in eine Funktion (Farbänderung) um, deshalb hatte ich das gleich weggelassen.


SELECT
"TIME_PROPERTIES für USER"."USR_NAME.NAME",
"TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date",
sum("TIME_PROPERTIES für USER"."TIME_PROPERTIES.QTY") filter (where "TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date" = '2019'),
sum("TIME_PROPERTIES für USER"."TIME_PROPERTIES.QTY") filter (where "TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date" = '2020')
FROM "TIME_PROPERTIES für USER"
WHERE "TIME_PROPERTIES für USER"."USR_NAME.NAME" like '%DUS%'
GROUP BY "TIME_PROPERTIES für USER"."USR_NAME.NAME"

liefert genauso einen Fehler, gibt es eine andere Möglichkeit das zu lösen ?
 
das geht vielleicht case ... when ...

Code:
test=*# select name, sum(wert) filter (where jahr = 2019) as "Summe_2019", sum(case when jahr = 2020 then wert else 0 end) as "Summe_2020" from lars_eberhardt group by name;
 name  | Summe_2019 | Summe_2020
-------+------------+------------
 peter |        4.5 |       7.25
 hanna |        4.5 |       8.75
(2 rows)
 
Hallo Akretschmer,

diesmal habe ich sogar eine Fehlermeldung zurück bekommen die da lautet:

Fehlerdetails:
Abfragefehler: Falscher Einsatz der GROUP BY-Anweisung.

Bitte sorgen Sie dafür, dass sämtliche nicht aggregierten, in der SELECT-Anweisung eingesetzten Spalten auch in der GROUP BY-Anweisung verwendet werden.


Meine aktuelle Abfrage


SELECT
"TIME_PROPERTIES für USER"."USR_NAME.NAME",
"TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date",
sum (case when "TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date" = '2019' then "TIME_PROPERTIES für USER"."TIME_PROPERTIES.QTY" else 0 end) as "Summe 2019",
sum (case when "TIME_PROPERTIES für USER"."TIME_PROPERTIES.Date" = '2020' then "TIME_PROPERTIES für USER"."TIME_PROPERTIES.QTY" else 0 end) as "Summe 2020"
FROM "TIME_PROPERTIES für USER"
WHERE "TIME_PROPERTIES für USER"."USR_NAME.NAME" like '%DUS%'
GROUP BY "TIME_PROPERTIES für USER"."USR_NAME.NAME"


Kann es sein, dass er es nicht gruppieren kann weil er es nicht wie bei dir hinbekommt daraus einzelne Spalten zu machen? Gibt es dafür auch eine Einzelfunktion, ich denke dann könnte es funktionieren.
 
Werbung:
Hallo Akretschmer,

vielen Dank für die vielen Hinweise ich konnte das Problem lösen. es war ein Fehler in der Gruppierung ich musste den zweiten Wert mit "," anfügen dann hat es geklappt.

Super Support DANKE dafür.
 
Zurück
Oben