2016-12-01 6 views
0

Wir haben eine Webanwendung, die Prämienpunkte für Kunden erfasst. Wir verwenden eine MySQL-Datenbank. Ich hatte ursprünglich eine Abfrage, die Daten aus einer einzigen Tabelle gezogen und zeigte die Menge der Punkte in jeder Transaktion zusammen mit der Waage (Running) der Code unten:Erstellen eines Laufbilanzsaldos bei Abfrage mit Union

SELECT DateSubmitted 
, PointTotal as Points 
, (SELECT SUM(PointTotal) 
     FROM ptrans_detail x 
      WHERE x.CustID = a.CustID 
      AND (x.DateSubmitted < a.DateSubmitted OR x.DateSubmitted = a.DateSubmitted)) AS RunningTotal 
, comment 
    FROM ptrans_detail a 
    WHERE CustID='10009' 
    Order by TransID Desc 

Das funktionierte gut, bis es entdeckt wurde, dass es einige Einträge waren, die nicht in der Tabelle ptrans_detail hat existiert und diese Frage wurde hier gepostet: alle Datensätze Query Data from 2 MySQL tables with some duplicate records

Wie vorgeschlagen, ich UNION 2 Anfragen von 2 Tabellen zu kombinieren, zu gewöhnen, dass die Anfrage:

SELECT CustID 
     , DateSubmitted 
     , Type 
     , Points 
      FROM `trans_summary` 
      WHERE CustID = '10009' 
UNION 

SELECT CustID 
, DateSubmitted 
, Type 
, PointTotal 
    FROM `ptrans_detail` 
     WHERE CustID = '10009' 
      and DateSubmitted NOT IN 
      (SELECT DateSubmitted FROM 
      `trans_summary` 
       WHERE CustID = '10009') 

Das hat gut funktioniert, aber jetzt möchte ich das RunningTotal wie in der ersten Abfrage hinzufügen. Ist das möglich?

+1

Sicher, betrachten diese ganzen Aussagen, die als Unterabfrage und tut, um die laufende Summe außerhalb des SELECT * FROM (Ihre Union-Abfrage hier). Außerdem sind mysql und sql server verschiedene Datenbanken, die Sie verwenden? –

+0

Hallo Rich, ich benutze MySQL. – danman280

Antwort

0

Haben Sie dies wünschen:

SELECT CustID, DateSubmitted, Type, SUM(Points) FROM (SELECT CustID 
      , DateSubmitted 
      , Type 
      , Points 
       FROM `trans_summary` 
       WHERE CustID = '10009' 
    UNION 

    SELECT CustID 
    , DateSubmitted 
    , Type 
    , PointTotal as Points 
     FROM `ptrans_detail` 
      WHERE CustID = '10009' 
       and DateSubmitted NOT IN 
       (SELECT DateSubmitted FROM 
       `trans_summary` 
        WHERE CustID = '10009')) AS tr_summery 
0

Ich würde Ihnen raten, union all zu verwenden, es sei denn, Sie wirklich union brauchen.

Der einfachste Weg, um eine laufende Summe in MySQL zu bekommen, ist Variablen zu verwenden:

SELECT t.*, 
     (@sump := if(@c = CustId, @sump + Points, 
        if(@c := CustId, Points, Points) 
        ) 
     ) as runningTotal 
FROM (SELECT CustID, DateSubmitted, Type, Points 
     FROM trans_summary 
     WHERE CustID = '10009' 
     UNION ALL -- Maybe it should be `UNION` 
     SELECT CustID, DateSubmitted, Type, PointTotal 
     FROM ptrans_detail 
     WHERE CustID = '10009' AND 
      DateSubmitted NOT IN (SELECT ts.DateSubmitted FROM trans_summary ts WHERE ts.CustID = '10009') 
    ) t CROSS JOIN 
    (SELECT @c := -1, @sump := 0) params 
ORDER BY CustId, DateSubmitted; 
+0

Nun, einige der Datensätze sind in beiden Tabellen dupliziert, also wollte ich nur diese einmal zeigen, ich war unter dem Eindruck, der durch die Verwendung von UNION über UNION ALL – danman280

+0

funktioniert. Mein einziges Problem ist, dass ich nach DateSubmitted Desc (Neueste Einträge zuerst) anzeigen möchte. Die laufende Gesamtsumme beginnt jedoch am letzten Datum und die Gesamtsumme geht zurück ... Wie kann ich das umkehren, so dass es vom ältesten DataSubmitted vorwärts geht? – danman280

+0

Löst 'ORDER BY CustId, DateSubmitted DESC' das Problem? –