mysql-запрос использует каждую строку другого запроса

Я много искал, но не могу найти полезный ответ:

Я хочу иметь список итогов за определенный пользователем период, указав дату начала и окончания. Итоговые суммы должны каждый раз, начиная с даты начала, начинать с даты начала и добавлять каждую строку 1 день. поэтому последняя строка дает итоговые значения от начала до конца. пример: – данный период = начало 2013-01-01, конец = 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 ... 

поэтому у меня есть запрос, который вычисляет все дни:

 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 

и у меня есть запрос, который вычисляет итоговые суммы в день

 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 

теперь объединение этих двух, чтобы получить мой окончательный результат трудно.

в основном, как выглядит последний запрос:

 - 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 ... 

любая помощь? спасибо. это упрощенный пример моего последнего запроса.

Ниже приведен образец. Идея состоит в том, чтобы получить начальный набор данных, упорядоченный по дате и имеющий совокупные итоговые значения, неявные записи диапазона дат. Затем с помощью курсора вы можете пройти через каждую строку, чтобы получить итоговый итоговый столбец (столбец amountCalc в примере), просто суммируя предыдущие записи – будет работать, потому что у вас уже есть столбцы, упорядоченные по дате.

Эта процедура может иметь другие параметры ввода / вывода. Вместо того, чтобы получать информацию из таблицы, вы можете получить данные с одного вида, где представление может быть уже упорядочено по дате asc. Это просто образец, который можно настроить по мере необходимости.

Удачи.

 -- 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 stored 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