Использование результатов родительских запросов во вложенном select - PullRequest
1 голос
/ 27 мая 2009

Я уверен, что это довольно тривиальная проблема, но я не уверен, что 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

1 Ответ

2 голосов
/ 27 мая 2009
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

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

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, но каждый месяц он будет учитываться только один раз.

...