la consulta de mysql usa cada fila de otra consulta

He buscado mucho, pero no puedo encontrar una respuesta útil:

Quiero tener una list de totales de un período que el usuario define al darme una date de inicio y finalización. Los totales deben ser desde la date de inicio hasta la date de inicio y agregar cada fila 1 día. por lo que la última fila da los totales desde el inicio hasta la date de finalización. ejemplo: – período dado = inicio 2013-01-01, final = 2013-01-31

total day 1 = 100 total day 2 = 0 (not listed in my totalsperday query, but should have a row in my final query) total day 3 = 140 total day 4 = 20 ... final table should look like: end day 1: 100 end day 2: 100 end day 3: 240 end day 4: 260 ... 

entonces tengo una consulta que calcula todos los días:

 SELECT '2013-01-01' as startdate, w.endDate FROM ( SELECT date('2013-01-01' + INTERVAL ui*100 + vi*10 + wi DAY) AS endDate FROM sysints AS u JOIN sysints AS v JOIN sysints AS w WHERE ( ui*100 + vi*10 + wi ) <= ( SELECT DATEDIFF( '2013-01-31','2013-01-01') as ddff ) ) w ORDER BY w.endDate ASC 

y tengo una consulta que calcula los totales por día

 SELECT p.selldate, SUM(p.price) as totalPerDay FROM products p WHERE '2013-01-01' >= p.selldate <= '2013-01-31' GROUP BY p.selldate ORDER BY p.selldate ASC 

ahora combinar estos dos para get mi resultado final es difícil.

Básicamente, cómo debería verse la consulta final es:

 - make the sum of sumperday from day 1 to day 1 - make the sum of sumperday from day 1 to day 2 - make the sum of sumperday from day 1 to day 3 ... 

¿alguna ayuda? Gracias. este es un ejemplo simplificado de mi consulta final.

Debajo está la muestra. La idea es get un set de datos inicial orderados por date y tener totales agregados, loggings de range de dates implícitos. Luego, usando el cursor puede pasar a través de cada fila para get la columna final total (columna amountCalc en la muestra) con solo resumir los loggings previos – funcionará porque ya tiene las columnas orderadas por date.

El procedimiento puede tener otros parameters de input / salida. En lugar de get información de la tabla, puede get datos de una vista, donde la vista ya puede orderarse por date asc. Es solo una muestra, por lo que se puede personalizar según sea necesario.

Buena suerte.

 -- drop table `Balance`; CREATE TABLE `Balance` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` DATE NOT NULL, `account` varchar(30) NOT NULL, `amount` DECIMAL(10,2) NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `Balance` (`date`, `account`, `amount`) VALUES ('2013-01-02', 'T355176', 8700), ('2013-01-03', 'T355176', 8900), ('2013-01-04', 'T355215', 33308), ('2013-01-03', 'T355215', 116581), ('2013-01-06', 'T812022', 275000), ('2013-01-02', 'T812063', 136500), ('2013-01-05', 'T812063', 11682), ('2013-01-06', 'T812064', 615100), ('2013-01-03', 'T812064', 25000), ('2013-01-02', 'T812085', 82500); SELECT * FROM Balance WHERE date >= '2013-01-01' AND date <= '2013-01-06' ORDER BY date ASC; CALL sp_getTotals('2013-01-01', '2013-01-06'); -- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stonetworking by the server -- -------------------------------------------------------------------------------- DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `sp_getTotals`(IN startDate DATE, IN endDate DATE) BEGIN DECLARE dt DATE; DECLARE amt DECIMAL(10,2); DECLARE amtCalcPart DECIMAL(10,2); DECLARE done INT DEFAULT 0; DECLARE dtStart DATE; DECLARE dtEnd DATE; DECLARE cur1 CURSOR FOR SELECT date, amount FROM `TempMB`; DECLARE cur2 CURSOR FOR SELECT startDate, endDate; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; DROP TEMPORARY TABLE IF EXISTS `TempMB`; CREATE TEMPORARY TABLE IF NOT EXISTS `TempMB` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` DATE NOT NULL, `amount` DECIMAL(10,2) NULL DEFAULT 0.00, `amountCalc` DECIMAL(10,2) NULL DEFAULT 0.00, PRIMARY KEY (`id`) ); SET dtStart = DATE(startDate); SET dtEnd = DATE(endDate); WHILE dtStart <= dtEnd DO INSERT INTO `TempMB` (`date`) SELECT dtStart; SET dtStart = DATE_ADD(dtStart, INTERVAL 1 DAY); END WHILE; SELECT * FROM TempMB; -- Fill temp table with info needed UPDATE `TempMB` t INNER JOIN ( SELECT date, SUM(amount) AS amount FROM Balance WHERE date >= startDate AND date <= endDate GROUP BY date ORDER BY date ASC ) b ON b.date = t.date SET t.amount = b.amount; /*INSERT INTO `TempMB` (`date`, `amount`) SELECT date, SUM(amount) AS amount FROM Balance WHERE date >= startDate AND date <= endDate GROUP BY date ORDER BY date ASC; */ SET amtCalcPart = 0.00; -- Initialise cursor OPEN cur1; -- USE BEGIN-END handler for cursor-control within own BEGIN-END block BEGIN DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END; -- Loop cursor throu temp records LOOP -- Get next value FETCH cur1 INTO dt, amt; -- Calculate amountCalc SET amtCalcPart = (SELECT SUM(amount) as amt FROM `TempMB` WHERE Date <= dt); UPDATE `TempMB` SET amountCalc = amtCalcPart WHERE date = dt; END LOOP; END; -- Release cursor CLOSE cur1; SELECT * FROM TempMB; END