2009-05-27 64 views
1

我相信這是一個相當平凡的問題,但我不確定谷歌找到解決方案。在嵌套select中使用父查詢的結果

我有一個表,看起來像這樣:

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表

回答

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 

你寫,你不指示泄漏的性能,但這種語法不是要複雜得多,但效率會更高(以防萬一):

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的,但它只會計數一個月只有一次。

+0

我*想*我明白這裏發生了什麼,但是第一個「改變」字段是什麼? – grapefrukt 2009-05-27 12:37:26