Crear un Total de saldo stream en la consulta con Unión

Tenemos una aplicación web que rastrea los puntos de recompensa para los clientes. Estamos usando una database MySQL. Originalmente tuve una consulta que extraía datos de una sola tabla y mostraba la cantidad de puntos en cada transacción junto con el saldo (RunningTotal), el código está a continuación:

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 

Esto funcionó bien hasta que se descubrió que había algunas inputs que no existían en la tabla ptrans_detail y esa pregunta se publicó aquí: Datos de consulta de 2 tablas de MySQL con algunos loggings duplicates

Como se sugirió, utilicé UNION para combinar 2 consultas de 2 tablas para get TODOS los loggings, esa consulta es:

 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') 

Eso funcionó muy bien, pero ahora me gustaría agregar el RunningTotal a esto como en la primera consulta. es posible?

Quieres esto:

 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 

Te aconsejaría que uses union all , a less que realmente necesites union .

La forma más fácil de get una sum stream en MySQL es usar variables:

 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;