Summenproblem

Schnurze

Benutzer
Beiträge
16
Hi,

mit folgender Abfrage:
Code:
SET @J ='%2018-10-04%';
SELECT
   DATE_FORMAT(T.ausgang, '%d.%m.%Y') AS Datum,
   R.rechnungsnr AS ReNr,
   T.po AS KdNr,
   REPLACE(CAST(CAST(SUM(REPLACE(P.preis, ',', '.')) AS DECIMAL(10,2)) + IF(sum(T.entsorgung) IS NULL, cast(replace('0,00', ',', '.') AS DECIMAL(10,2)), CAST(SUM(REPLACE(T.entsorgung, ',', '.')) AS DECIMAL(10,2))) AS DECIMAL(10,2)), '.',',') AS Betrag
FROM
   `pakete` AS T,
   `preise` AS P,
   `rechnungen` AS R
WHERE T.ausgang LIKE @J AND T.size = P.groesse AND T.po = R.kundennr AND R.rechnungsdatum LIKE @J
GROUP BY R.rechnungsnr
UNION ALL
SELECT
   DATE_FORMAT(T.ausgang, '%d.%m.%Y') AS Datum,
   'Summe' ReNr,
   '' KdNr,
   REPLACE(CAST(CAST(SUM(REPLACE(P.preis, ',', '.')) AS DECIMAL(10,2)) + IF(sum(T.entsorgung) IS NULL, cast(replace('0,00', ',', '.') AS DECIMAL(10,2)), CAST(SUM(REPLACE(T.entsorgung, ',', '.')) AS DECIMAL(10,2))) AS DECIMAL(10,2)), '.',',') AS Betrag
FROM
   `pakete` AS T,
   `preise` AS P
   
WHERE T.ausgang LIKE @J AND T.size = P.groesse
LIMIT 1000

erhalte ich wunschgemäß die Tagessumme:

Datum;ReNr;KdNr;Betrag
04.10.2018;24855;1305;5,50
04.10.2018;24856;3618;0,00
04.10.2018;24857;524;2,50
04.10.2018;24858;524;2,50
04.10.2018;24859;3440;15,60
04.10.2018;24860;938;3,00
04.10.2018;24861;1821;5,50
04.10.2018;24862;1915;2,50
04.10.2018;24863;3580;2,50
04.10.2018;24864;151;12,00
04.10.2018;24865;3504;0,00
04.10.2018;24866;682;1,80
04.10.2018;24867;528;5,00
04.10.2018;24868;875;3,00
04.10.2018;24869;2697;2,50
04.10.2018;24870;1904;13,40
04.10.2018;24871;687;8,40
04.10.2018;24872;3244;2,50
04.10.2018;24873;1415;10,50
04.10.2018;24874;1690;4,30
04.10.2018;24875;1129;5,50
04.10.2018;24876;3566;3,00
04.10.2018;24877;133;2,50
04.10.2018;24878;1424;6,50
04.10.2018;24879;973;2,50
04.10.2018;24880;98;2,50
04.10.2018;24881;366;3,00
04.10.2018;24882;2766;4,30
04.10.2018;24883;187;5,00
04.10.2018;24884;2469;2,50
04.10.2018;24885;1490;3,50
04.10.2018;24886;349;3,00
04.10.2018;24887;1701;5,00
04.10.2018;24888;2103;4,30
04.10.2018;24889;575;2,50
04.10.2018;24890;3225;1,80
04.10.2018;24891;3195;3,00
04.10.2018;24892;3285;16,50
04.10.2018;24893;894;7,50
04.10.2018;24894;3221;13,00
04.10.2018;24895;2995;5,00
04.10.2018;24896;1481;11,50
04.10.2018;24897;1853;2,50
04.10.2018;24898;660;3,00
04.10.2018;24899;1763;3,00
04.10.2018;24900;839;2,50
04.10.2018;24901;3424;11,00
04.10.2018;24902;2234;2,50
04.10.2018;24903;1319;2,50
04.10.2018;24904;2127;1,80
04.10.2018;24905;3560;5,50
04.10.2018;24906;2014;15,50
04.10.2018;24907;1846;12,00
04.10.2018;Summe;;276,20

Wie erhalte ich nun daraus Monatswerte?
 
Werbung:
Warum mauschelst Du so mit den Datentypen rum? Sieht gruselig aus. Sowohl beim Betrag, als auch beim Datum.

Was für Monatswerte willst Du daraus haben? Das ist nur ein Tag. Ansonsten das als Basis nehmen, aus dem Datum den Monat ermitteln, danach summeieren & gruppieren. Die Summenzeile dabei eher nicht verwenden ...
 
Die Datenbank ist auf US eingestellt, Betrag, bzw. die dafür benötigten Spalten sind VARCHAR, von daher sieht das ganze so schön aus und kann nicht so einfach geändert werden.

Monatswerte sollten täglich mit Gesammtsumme sein, ausser wenn halt keine Summe vorhanden:
01. Summe
02. Summe
04. Summe
....
Oktober Gesammtsumme

Mir fehlen da halt noch die Grundlagen...
Gibt es eine Funktion do while loop oder ähnlich?
 
Kinders, bitte merkt Euch: Datentypen sind dazu da, verwendet zu werden. Zahlen als Text zu speichern geht meiner Meinung nach nicht mehr als Anfängerfehler durch, das ist schlicht pure Dummheit.

Wenn Du für jeden Tag eine Summe haben willst, dann so:

Code:
test=*# select * from schnurze;
    tag     | betrag
------------+--------
 2018-11-17 |     10
 2018-11-17 |     20
 2018-11-20 |     30
 2018-11-21 |     40
(4 rows)

test=*# select tag, sum(betrag) from schnurze group by tag order by tag;
    tag     | sum
------------+-----
 2018-11-17 |  30
 2018-11-20 |  30
 2018-11-21 |  40
(3 rows)

test=*#

test=*# select tag, sum(betrag) from schnurze group by rollup(tag) order by tag;
    tag     | sum
------------+-----
 2018-11-17 |  30
 2018-11-20 |  30
 2018-11-21 |  40
            | 100
(4 rows)

Wenn Du eine Summe über den jeweiligen Monat haben willst:

Code:
test=*# select * from schnurze;
    tag     | betrag
------------+--------
 2018-11-17 |     10
 2018-11-17 |     20
 2018-11-20 |     30
 2018-11-21 |     40
 2018-12-27 |    140
 2018-12-27 |    240
 2019-04-06 |   1240
 2019-04-06 |   2240
 2019-11-17 |     99
(9 rows)

test=*# select *, extract(year from tag) as jahr, extract(month from tag) as monat, sum(betrag) over (partition by extract(year from tag), extract(month from tag)) as montasumme from schnurze order by tag;
    tag     | betrag | jahr | monat | montasumme
------------+--------+------+-------+------------
 2018-11-17 |     10 | 2018 |    11 |        100
 2018-11-17 |     20 | 2018 |    11 |        100
 2018-11-20 |     30 | 2018 |    11 |        100
 2018-11-21 |     40 | 2018 |    11 |        100
 2018-12-27 |    140 | 2018 |    12 |        380
 2018-12-27 |    240 | 2018 |    12 |        380
 2019-04-06 |   1240 | 2019 |     4 |       3480
 2019-04-06 |   2240 | 2019 |     4 |       3480
 2019-11-17 |     99 | 2019 |    11 |         99
(9 rows)

Soll die monatliche Zusammenfassung als Zeile unterhalb stehen gibt es auch noch Dinge wie ROLLUP etc. Aber das hilft alles nix, solange Du mit Deine völlig kaputten Datentypen unterwegs bist.
 
um vielleicht mal noch ROLLUP zu zeigen:

Code:
test=*# select tag, extract(month from tag) as monat, extract(year from tag) as jahr, sum(betrag) from schnurze group by grouping sets (tag, extract(month from tag),extract (year from tag)) order by tag, extract(month from tag), extract(year from tag) ;
    tag     | monat | jahr | sum  
------------+-------+------+------
 2018-11-17 |       |      |   30
 2018-11-20 |       |      |   30
 2018-11-21 |       |      |   40
 2018-12-27 |       |      |  380
 2019-04-06 |       |      | 3480
 2019-11-17 |       |      |   99
            |     4 |      | 3480
            |    11 |      |  199
            |    12 |      |  380
            |       | 2018 |  480
            |       | 2019 | 3579
(11 rows)
 
Vielen Dank. Ich habe aber, wie ich erst jetzt festgestellt habe, ein ganz anderes Problem.
Zum Berechnen der Rechnungen brauche ich 3 Tabellen.
In der Tabelle pakete befinden sich u.a. die Kundennummer T.po (natürlich als VARCHAR...), der Zeitpunkt der Rechnungserstellung T.ausgang(Datetime) und die Größe T.size (VARCHAR).
In der Tabelle preise befinden sich die Größe P.groesse (VARCHART) und die Preise P.preis ( VARCHART, was sonst..).
In der Tabelle rechnungen befinden sich Rechnungsnummer R.rechnungsnr (selbstredend VARCHART) und Kundennummer R.kundennr (VARCHART) sowie Rechnungsdatum R.rechnungsdatum (wirklich DATE, da muss jemand wohl nen Geistesblitz gehabt haben).
Mit meiner obigen Abfrage bekomme ich zwar den richtigen Tagessaldo, allerdings fehlerhafte Rechnungssummen, wenn ein Kunde mehrere Rechnungen pro Tag erhält. Es werden pro Rechnung alle Einzelsummen addiert. Wie bekomme ich das hin?
 
Joinen und aggregieren. Es gibt genug Doku dazu, einfach mal anfangen. Ob nun Rechnungs- und Kundennummern als VARCHAR sind oder was anderes ist erst mal nicht das Problem, es kann ja sein, daß diese Nummern als Buchstaben enthalten können/sollen etc., damit wird man ja nicht rechnen. Preise als TEXT ist aber massiv fail.
 
Ändern will ich da nur sehr ungern etwas, da mit diesen Tabellen alle möglichen Abfragen, Auswertungen Kron-Jobs etc. verknüpft sind - frei nach dem Motto: Never change a running system.

Nichtsdestotrotz habe ich noch mein Problem mit den 'falschen' Mehrfachrechnungen. Ich mache ja eigentlich nichts weiter als die Summen zu bilden. Ich erhalte ja mit der obigen Abfrage trotz teilweiser falscher Rechnungssummen den richtigen Tagessaldo (Keine Berücksichtigung der einzelnen Rechnungen bei UNION). Wenn ich ne Abfrage mit GROUP BY WITH ROLLUP mache, entspricht das Ergebnis zwar der Summe der Einzelrechnungen, ist damit aber leider falsch. Wie bekomme ich korrekte Rechnungssummen bei Mehrfachrechnungen?

Beispiel:
02.11.2018 26191 2552 13,00 korrekt wäre 3,50
02.11.2018 26192 2552 13,00 korrekt wäre 3,00
02.11.2018 26193 2552 13,00 korrekt wäre 3,50
02.11.2018 26194 2552 13,00 korrekt wäre 3,00

Ich habe also 4 Rechnungen für KdNr 2552, die ja auch nach meinen Bedingungen richtig berechnet werden, aber halt leider das falsche Ergebnis liefern. Wie mache ich das richtig?
Also Bedingung benutze pro Rechnung nur das gleiche DATETIME (T.ausgang) oder ähnlich...
 
Zuletzt bearbeitet:
Also um das Thema nochmals aufzugreifen vereinfache ich mal:
in der Tabelle 1 habe ich ein Datetime Feld, eine KdNr und ein Betrag.
in der Tabelle 2 habe ich ein Datum , eine KdNr und eine ReNr.
Die Abfrage soll nun nur alle ReNr, KdNr, Beträge pro Tag auflisten.
Mein Problem sind halt mehrere gleiche Kunden an einem Tag,
also wie bekomme ich es hin, dass die erste ReNr pro Kunde nur dem ersten Datetime zugeordnet wird?
 
Werbung:
OK - Danke für die Hilfe, habe das jetzt selbst lösen können. Falls jemand wissen will wie, hier meine Lösung:
Die Rechnungsnummer (auto_increment) aus der 2. Tabelle ist ja via dem Feld 'Ausgang' (DateTime) mit der 1. Tabelle verknüpft.
Also TEMPORARY TABLE aus 1. Tabelle mit Summieren/Gruppieren und Ordnen auf 'Ausgang', dann ID Spalte (auto_increment) hinzufügen.
TEMPORARY TABLE aus 2. Tabelle ordnen nach Rechnungsnummer, dann ebenfalls ID Spalte hinzufügen.
Alles natürlich für das gleiche Datum und dann Abfrage nach gleicher ID et voila....
Es Funktioniert genau so, wie es soll. Wenn jemand was einfacheres, besseres oder/und eleganteres weiss, einfach nur posten.
 
Zurück
Oben