2012-03-28 44 views
0

我有一個表,每月有不同日期發生多次付款。我希望查詢爲每個單獨的付款返回一行,並在同一行中返回該月/年的所有付款的SUM。總和在MySQL中的相關子查詢 - 使用相同的表

我的表結構是:

tbl_or_Distri 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `investment_id` int(11) NOT NULL, 
    `inv_distri_id` int(11) NOT NULL, 
    `trade_date` datetime NOT NULL, 
    `pay_date` datetime NOT NULL, 
    `amount` double NOT NULL, 
    `perc_return` double NOT NULL, 
    PRIMARY KEY (`id`), 

我的當前內部查詢是:

SELECT 
`investment_id`, 
SUM(`perc_return`) as perc_return, 
SUM(`capital_return`) as capital_return, 
SUM(amount) as TotalAmount, 
CONCAT(MONTH(pay_date), " ", YEAR(pay_date)) as short_date, 
MONTH(pay_date) as pay_month, 
YEAR(pay_date) as pay_year 
FROM `tbl_or_distri` 
WHERE investment_id=29 
GROUP BY YEAR(pay_date), MONTH(pay_date) 

總和(量),和(perc_return),和SHORT_DATE是3條記錄我需要返回主外部查詢的每一行。外部查詢是:

SELECT 
`investment_id`, 
    amount, 
    pay_date 
FROM `tbl_or_distri` 
WHERE investment_id=29 

如何將這兩個查詢合併爲一個?保持良好的表現? 謝謝!

+0

你試過'join'嗎? – safarov 2012-03-28 14:58:03

回答

0

你可以爲你的內部查詢創建一個視圖。

CREATE VIEW NameYourView AS 
SELECT 
`investment_id`, 
SUM(`perc_return`) as perc_return, 
SUM(`capital_return`) as capital_return, 
SUM(amount) as TotalAmount, 
CONCAT(MONTH(pay_date), " ", YEAR(pay_date)) as short_date, 
MONTH(pay_date) as pay_month, 
YEAR(pay_date) as pay_year 
FROM `tbl_or_distri` 
GROUP BY YEAR(pay_date), MONTH(pay_date) 

然後在您的外部查詢中使用該視圖。

SELECT t.investment_id, t.amount, t.pay_date, v.* 
FROM `tbl_or_distri` t 
inner join NameYourView v on v.investment_id = t.investment_id 
WHERE t.investment_id=29 

我不知道它如何處理性能,但它肯定會工作。

+0

馬丁,只是嘗試這樣做:'選擇 a.investment_id, 量, pay_date, b.totalamount, b.short_date FROM tbl_or_distri一個 INNER JOIN (SELECT investment_id, SUM(perc_return)爲perc_return, SUM(capital_return)作爲capital_return, SUM(量),爲總金額, CONCAT(MONTH(pay_date), 「」,YEAR(pay_date))作爲SHORT_DATE, MONTH(pay_date)作爲pay_month, YEAR(pay_date)作爲pay_year FROM tbl_or_distri as b2 WHERE b2.investment_id = 29 GROUP BY YEAR(pay_date),MONTH(pay_date) )b ON b.investment_id = a.investment_id WHERE a.investment_id = 29' – w00tw00t111 2012-03-28 15:15:36

+0

而且效果很好。試圖保持PHP腳本中的所有sql邏輯不使用存儲視圖。現在桌子很小,只有幾百條記錄。在短時間內 - 將會有超過一百萬...不知道當時的表現。 – w00tw00t111 2012-03-28 15:16:52

+0

保留PHP中的所有SQL查詢是一種選擇。我主要與MS SQL Server一起工作,並在那裏存儲視圖可以提高性能。儘管不知道MySQL。我在某處看到,MySQL中存儲的視圖爲您提供與自己運行查詢相同的性能。但是當遇到性能問題時,您仍然可以嘗試。 – Martin 2012-03-28 15:21:36

0

你是否需要每行中的SUM或者你是否只需要在同一個查詢中的信息?如果是後者,那麼WITH ROLLUP可能會爲你做伎倆

SELECT 
    `id`, 
    CONCAT(MONTH(pay_date), " ", YEAR(pay_date)) as short_date, 
    MONTH(pay_date) as pay_month, 
    YEAR(pay_date) as pay_year, 
    SUM(`perc_return`) as perc_return, 
    SUM(`capital_return`) as capital_return, 
    SUM(amount) as TotalAmount 
FROM `tbl_or_distri` 
WHERE investment_id=29 
GROUP BY pay_year, pay_month WITH ROLLUP 
+0

我需要每行中的月份/年份的總和。因此,如果2011年5月總和= 1,000(由於3條記錄5/1/2011 100,2011年5月10日400,2011年5月20日500)我需要查看:5/1/2011 100 1000 5/2011,5/10/2011 400 1000 5/2011,5/20/2011 500 1000 5/2011 – w00tw00t111 2012-03-28 15:22:35