Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Summierung (https://www.delphipraxis.net/186308-sql-summierung.html)

Sigi55 22. Aug 2015 20:37

Datenbank: MS SQL • Version: Aktuell • Zugriff über: HeidiSql

SQL Summierung
 
Moin,

ich knobel schon ein wenig an einer Abfrage, komm aber nicht weiter und hoffe das mir jemand helfen kann :-)

Ich habe 2 Tabellen: Aufträg und Zahlungen, beide verknüpft über die AuftragsNr.
Ich möchte mir alle Aufträge anzeigen lassen zu denen HEUTE Zahlungen eingegangen sind und zwar die gesammte Summe aller Zahlungen, quasi den Saldo.
Code:
SELECT tbl_auftrag1.anr, tbl_auftrag1.a_name,
  sum(tbl_zahlungen.ratenwert) as SummeZahlungen,
  count(tbl_zahlungen.ratendatum) as Anzahl
FROM (tbl_zahlungen INNER JOIN tbl_auftrag1 ON tbl_auftrag1.anr = tbl_zahlungen.fsanr)
WHERE CONVERT(varchar(8), tbl_zahlungen.ratendatum, 112) = CONVERT(varchar(8), GetDate(), 112)
GROUP BY tbl_auftrag1.anr, tbl_auftrag1.a_name
Das klappt soweit und zeigt die heutigen Zahlungen an (es können auch mehrere Zahlungen pro Auftrag an einem Tag kommen).
Aber es fehlen natürlich die in der Vergangenheit schon geleisteten Zahlungen.

Hat jemand eine Idee ?
Danke schonmal im vorraus.

Gruß

Sigi

jobo 22. Aug 2015 20:49

AW: SQL Summierung
 
Was ist jetzt die Frage?
Du willst die Summe von HEUTE und die hast Du.
Dass der Rest fehlt, ist klar, den wolltest Du ja nicht und hast die Daten auf den aktuellen Tag eingeschränkt.

Apropos: Diese Einschränkung ist schlecht umgesetzt. Du solltest das ohne Konvertierung des Tabellenfeldes machen, damit ein ggF. vorhandener Index greifen kann.

Sigi55 22. Aug 2015 21:16

AW: SQL Summierung
 
Hallo JoBo,

Zitat:

Zitat von jobo (Beitrag 1313092)
Was ist jetzt die Frage?
Du willst die Summe von HEUTE und die hast Du.
Dass der Rest fehlt, ist klar, den wolltest Du ja nicht und hast die Daten auf den aktuellen Tag eingeschränkt.

sry, dann hab ich das unverständlich rübergebracht.

Ich möchte nur die Aufträge sehen zu denen HEUTE Zahlungen eingegangen sind,
und zwar nicht nur den Tagessaldo, sondern den Gesamtsaldo, also incl. ALLER bisher geleisteten Zahlungen.

Sir Rufo 22. Aug 2015 21:22

AW: SQL Summierung
 
Man könnte die Aufgabe auch so beschreiben:
Zitat:

Hole mir alle Aufträge, bei denen heute eine Zahlung eingegangen ist und teile mir von diesen Aufträgen den Saldo mit.
Mit dieser Beschreibung hat man auch schon den ersten Schritt zur Lösung ;)

Sigi55 22. Aug 2015 21:29

AW: SQL Summierung
 
Zitat:

Zitat von Sir Rufo (Beitrag 1313094)
Man könnte die Aufgabe auch so beschreiben:
Zitat:

Hole mir alle Aufträge, bei denen heute eine Zahlung eingegangen ist und teile mir von diesen Aufträgen den Saldo mit.
Mit dieser Beschreibung hat man auch schon den ersten Schritt zur Lösung ;)

Bingo !! Endlich bringt es mal jemand auf den Punkt :-)

Mit dem Codebeispiel wollte ich nur zeigen auf welchem Weg ich bin und wie weit ...

cu

Sigi

Sir Rufo 22. Aug 2015 21:47

AW: SQL Summierung
 
Aufträge mit einer Zahlung an dem Tag
Delphi-Quellcode:
datum
SQL-Code:
select distinct fsanr
from tbl_zahlungen
where ratendatum = :datum
Saldo aller Aufträge
SQL-Code:
SELECT
  fsanr,
  sum(ratenwert) as SummeZahlungen,
  count(ratendatum) as Anzahl
FROM tbl_zahlungen
GROUP BY fsanr
Und jetzt alles zusammen:
SQL-Code:
select
  a.anr,
  a.a_name,
  Saldo.SummeZahlungen,
  Saldo.Anzahl
from tbl_auftrag1 as a
join ( 
  SELECT
    fsanr,
    sum(ratenwert) as SummeZahlungen,
    count(ratendatum) as Anzahl
  FROM tbl_zahlungen
  GROUP BY fsanr ) as Saldo on Saldo.fsanr = a.anr
where a.anr in (
  select distinct fsanr
  from tbl_zahlungen
  where ratendatum = :datum )
Und hier nochmal vereinfacht zum herumspielen
http://sqlfiddle.com/#!3/d66ab/3

Sigi55 23. Aug 2015 08:21

AW: SQL Summierung
 
Wow, yes, SIR!

hab mir das schon gedacht, das da irgenwie ein SubSelect dazu muss ...

Zitat:

Zitat von Sir Rufo (Beitrag 1313096)
Und jetzt alles zusammen:
SQL-Code:
select
  a.anr,
  a.a_name,
  Saldo.SummeZahlungen,
  Saldo.Anzahl
from tbl_auftrag1 as a
join ( 
  SELECT
    fsanr,
    sum(ratenwert) as SummeZahlungen,
    count(ratendatum) as Anzahl
  FROM tbl_zahlungen
  GROUP BY fsanr ) as Saldo on Saldo.fsanr = a.anr
where a.anr in (
  select distinct anr
  from tbl_zahlungen
  where ratendatum = :datum )

...nur hat mich das Beispiel schon wieder leicht an den Rand des Wahnsinns gebracht - es liefert ALLE Zeilen ?!
Und dann hab ich mir das Konstrukt mal Wort für Wort angeschaut und in

SQL-Code:
...
where a.anr in (
  select distinct [B]fsanr[/B]
  from tbl_zahlungen
  where ratendatum = :datum )
[/QUOTE]
geändert ... und BINGO, jetzt passt es !!:-D:-D

Aber das war bestimmt Absicht, um mich etwas auf Drehzahl zu bringen :-)

1000 Dank nochmal !!

Gruß

Sigi

Sir Rufo 23. Aug 2015 08:25

AW: SQL Summierung
 
Nee, war nur so ein Vertipper, ich hab das einfach nur so dahingeschrieben ohne Evaluierung. Ist im Beitrag jetzt auch korrigiert.

Im Fiddle-Link ist es korrekt gewesen ;)

Sigi55 23. Aug 2015 08:39

AW: SQL Summierung
 
Moin SIR,

war dieser "Fiddle-Link" gestern auch schon da?
Wenn ja, hab ich den komplett übersehen ...
Der Vertipper war aber nicht schlecht ..., zwingt einen genauer
hinzusehen :-)

Vielen Dank nochmal ...

Gruß

Sigi


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