2009-05-27 6 views
1

Я уверен, что это довольно тривиальная проблема, но я не уверен, что делать с Google, чтобы найти решение.Использование результатов родительских запросов во вложенном элементе

У меня есть таблица, которая выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `transactions` (
    `name` text collate utf8_swedish_ci NOT NULL, 
    `value` decimal(65,2) NOT NULL, 
    `date` date NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=COMPACT; 

Я заселить, вырезая и вставляя данные из моего интернет-банкинга. Значение может быть отрицательным или положительным значением, то, как дата и имя содержат должно быть достаточно очевидно;) я построил запрос, чтобы позволить мне увидеть мою нижнюю строку для каждого месяца:

SELECT sum(`value`) as 'change', DATE_FORMAT(`date`, '%M %Y') as 'month' 
FROM `transactions` 
WHERE 1 
GROUP BY year(`date`), month(`date`) 

Теперь я хотел бы чтобы добавить общую сумму накопленных денег на счет в конце месяца в качестве дополнительной колонки.

SELECT sum(`value`) as 'change', DATE_FORMAT(`date`, '%M %Y') as 'month', 
(SELECT sum(`value`) FROM `transactions` WHERE `date` <= 123) as 'accumulated' 
FROM `transactions` 
WHERE 1 
GROUP BY year(`date`), month(`date`) 

123 это не совсем то, что я хочу туда, но я не понимаю, как получить в результате от моего DATE_FORMAT внутри этого подзапроса.

Действительно ли это подходит для решения этой проблемы?

Это в основном личное упражнение (работает на очень маленьком наборе данных), поэтому я не очень обеспокоен производительностью, читаемый SQL гораздо важнее.

Я бегу таблицу InnoDB на MySQL 5.0.45

ответ

2
SELECT change, 
     CONCAT(mymonth, ' ', myyear) AS 'month', 
     (
     SELECT SUM(`value`) 
     FROM `transactions` 
     WHERE `date` < DATE_ADD(STR_TO_DATE(CONCAT('01.', mymonth, '.', myyear, '%D.%M.%Y'), INTERVAL 1 MONTH)) 
     ) 
FROM (
     SELECT sum(`value`) as 'change', YEAR(date) AS myyear, MONTH(date) AS mymonth 
     FROM `transactions` 
     WHERE 1 
     GROUP BY 
       YEAR(`date`), MONTH(`date`) 
     ) q 

Вы писали, что вы не Cate для исполнения, но этот синтаксис не намного сложнее, но будет более эффективным (на всякий случай):

SELECT SUM(value) AS change, 
     CONCAT(MONTH(`date`), ' ', YEAR(`date`)) AS 'month', 
     @r : = @r + SUM(value) AS cumulative 
FROM (
     SELECT @r := 0 
     ) AS vars, 
     transactions 
WHERE 1 
GROUP BY 
     YEAR(`date`), MONTH(`date`) 
ORDER BY 
     YEAR(`date`), MONTH(`date`) 

Это один будет считать кумулятивным SUM «s, как хорошо, но он будет считать каждый месяц только один раз.

+0

Я * думаю * Я понимаю, что здесь происходит, но что это первое поле «изменения»? – grapefrukt

+0

Это ваш SUM из внутреннего подзапроса. Извините, я не заметил, что это когда-то стол, см. Сообщение об обновлении – Quassnoi