Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

2 SQL Abfragen verknüpfen mit Summe und Vergleich

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von CR-CR, 28 Januar 2016.

  1. CR-CR

    CR-CR Benutzer

    Hallo,

    ich stehe seit einigen Tagen vor einer riesigen Herausforderung (zumindest für mich) und versuche verzweifelt, sie zu lösen.

    Und zwar geht es um folgendes Konzept:

    Ich habe zwei Datenbanktabellen und möchte die Ergebnisse von den beiden Tabellen in einer zusammenführe und 2 extra Funktionen einbauen.

    Ich habe bisher leider nur beide Tabellen erstellen können, ich weiß weder, wie man sie verbindet, noch wie man sie das machen lässt, was sie sollen.

    Der Aufbau soll in etwa so aussehen:

    Kundennummer (in Tabelle ff.RechAusg)
    Rechnungsnummer (in Tabelle ff_RechAusg und ff_Zahlung_ein)
    Brutto (Rechnungswert) (in Tabelle ff.RechAusg)
    Gezahlt (Gezahlter Betrag) (in Tabelle ff_Zahlung_ein)
    --------
    jetzt soll die Differenz ausgerechnet werden
    Brutto abzüglich Gezahlt (Tabelle ff_RechAusg und ff_Zahlung_ein)
    --------
    dann soll eine 0 in einer neuen Spalte angezeigt werden, wenn beide Ergebnisse gleich sind (Brutto und Gezahlt) sonst soll eine 1 angezeigt werden.

    Zu beachten ist, dass alle Rechnungsnummern aus Tabelle ff.RechAusg auf jeden Fall angezeigt werden müssen.

    Da eine Rechnung mehrere Positionen enthält, muss distinct verwendet werden.


    Hier sind die Befehle zum Abrufen der beiden Tabellen:
    Tabelle 1
    SELECT DISTINCT
    RG_NR
    , WERT_BRUTTO
    FROM [DATENBANK].[dbo].[ff_RechAusg]
    where RG_NR > 460000

    Tabelle 2
    SELECT
    RECHNUNGSNR as RG_NR,
    SUM(BETRAG) as GEZAHLT
    FROM [DATENBANK].[dbo].[ff_Zahlung_ein]
    where RECHNUNGSNR > 460000
    group by RECHNUNGSNR


    Vielen Dank für jede Hilfe!
     
  2. ukulele

    ukulele Datenbank-Guru

    Steht da wirklich der gesamt-Brutto-Wert mehrfach in der Tabelle oder ist WERT_BRUTTO jeweils auf die Rechnungsposition bezogen und muss aufaddiert werden?
     
  3. CR-CR

    CR-CR Benutzer

    Hallo ukulele,

    WERT_BRUTTO ist jedes Mal der gesamt-Brutto-Wert.
     
  4. ukulele

    ukulele Datenbank-Guru

    Das ist schonmal schlechtes Design und muss in deiner jetzigen Abfrage mit Aufwand korrigiert werden. DISTINCT kann man dazu nutzen, wenn natürlich mal fehlerhafte Brutto-Werte eingetragen werden passt es nicht mehr.

    Hier mit DISTINCT:
    Code:
    SELECT    Rechnungen.RG_NR,
            Rechnungen.WERT_BRUTTO,
            sum(BETRAG) AS GEZAHLT,
            Rechnungen.WERT_BRUTTO - isnull(sum(BETRAG),0) AS differenz,
            ( CASE WHEN Rechnungen.WERT_BRUTTO - isnull(sum(BETRAG),0) = 0 THEN 0 ELSE 1 END ) AS gezahlt_flag
    FROM    (
    
    SELECT    DISTINCT
            RG_NR,
            WERT_BRUTTO
    FROM    [DATENBANK].[dbo].[ff_RechAusg]
    
            ) Rechnungen
    LEFT JOIN [DATENBANK].[dbo].[ff_Zahlung_ein] Zahlungen
    ON        Rechnungen.RG_NR = Zahlungen.RECHNUNGSNR
    WHERE    Rechnungen.RG_NR > 460000
    GROUP BY Rechnungen.RG_NR,Rechnungen.WERT_BRUTTO
     
  5. CR-CR

    CR-CR Benutzer

    Danke ukulele, das funktioniert soweit, jedoch wirft er mir, wenn die Differenz 0 ist, beispielsweise diesen Wert aus:
    Brutto Gezahlt Differenz
    2377,99 2377,99 4,54747350886464E-13 1

    Hast du eine Idee, warum?

    Und leider zeit er bei Sachen, die beispielsweise überzahlt wurden auch eine 1 an - dort soll er, wenn möglich, auch eine 0 anzeigen, so, als wäre es offen.
     
    Zuletzt bearbeitet: 29 Januar 2016
  6. CR-CR

    CR-CR Benutzer

    Diesen Teil kannst du gerne ignorieren, ich habe mich vertan, das stimmt soweit, nur der obere Teil im Beitrag zuvor macht mir Probleme.
     
  7. ukulele

    ukulele Datenbank-Guru

    Welches Format haben denn die Spalten WERT_BRUTTO und BETRAG? Ich vermute mal du hast hier mehr Nachkommastellen als du siehst, anders kann ich das nicht erklären.
     
  8. CR-CR

    CR-CR Benutzer

    Zu dem Format kann ich leider auch nichts sagen, aber kann man es so machen, dass der Wert 0 ausgeworfen wird, wenn beide Zahlen gleich sind?

    Vielen Dank nochmal für die Hilfe!
     
  9. akretschmer

    akretschmer Datenbank-Guru

    case when ... ?
     
  10. ukulele

    ukulele Datenbank-Guru

    1 - 1 sollte 0 ergeben, das ist ja Sinn der Spalte. Wenn da natürlich eine Differenz raus kommt geht es nicht auf 0 es sei denn, man rundet vieleicht noch oder sagt CASE WHEN Rechnungen.WERT_BRUTTO - isnull(sum(BETRAG),0) BETWEEN -1 AND 1 THEN 0 ELSE ... so das kleinere Differenzen nicht berücksichtigt werden. Das ist jetzt aber Mathe, das solltest du hin kriegen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden