题
我敢肯定,这是一个相当琐碎的问题,但我不知道该怎么谷歌找到了解决方案。
我有一个表,看起来像这样:
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是重要得多。
我在MySQL 5.0.45运行InnoDB表
解决方案
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
的为好,但它每个月会计算一次。
不隶属于 StackOverflow