2013-01-11 87 views
2
SELECT ex.`ID`, ex.`ExpenseName`, om.`Taka`, SUM(om.`Taka`) AS 'Total Taka' 
    FROM (office_expense_main om) 
     JOIN (office_expenses ex) 
       ON (ex.ID=om.OfficeExpenseID) 
     JOIN (yyyy_mm_officeexpense ym) 
       ON (ym.Year_Month = '" + _yearMonth + "' AND om.YearMonthID <= ym.ID) 
    GROUP BY om.`OfficeExpenseID` 

此查詢應顯示[om。給出[ym.Year_Month]和sum [om。]的[Taka]。 Taka] - 表示所有之前Taka直到給定Year_Month的總和。它顯示了第一Year_Month的'Taka'(例如,如果我想看到'taka'的行軍和總和('Taka')直到3月,它顯示我'Taka'是一月(yyyy_mm表中的第一個入口)不是爲了遊行,而是顯示我想要看到的總和('Taka')而不是我提供的那個。但總和(塔卡),直到給定的YearMonth。!mysql查詢 - 沒有得到它應該提供的結果

但它昨天之前顯示完全相同的結果!但我沒有改變任何東西,我不明白爲什麼它顯示不同現在..

任何人都可以幫助我!

+0

如果你仍然有問題,你介意更新你的問題與一些示例表數據和預期的結果pleaes? – bonCodigo

回答

2

由於MySQL中稱爲「隱藏列」的(錯誤)功能,您的查詢失敗。列名om.Taka不是聚合列,所以MySQL返回任意值。那麼,通常這是您看到的第一個值,但這不能保證。

您需要返回到office_expense_main表。我認爲以下可能是你想要的:

SELECT ex.id, ex.`ExpenseName`, omlatest.om.taka, SUM(om.`Taka`) AS 'Total Taka' 
FROM office_expense_main om JOIN 
    office_expenses ex 
    ON ex.ID = om.OfficeExpenseID JOIN 
    yyyy_mm_officeexpense ym 
    ON ym.Year_Month = '" + _yearMonth + "' AND om.YearMonthID <= ym.ID join 
    office_expenses omlatest 
    on om.YearMonthId = ym.id and exiID = omlatest.OfficeExpenseId 
GROUP BY ex.id 

我還沒有測試過這個查詢,所以它可能有語法錯誤。

+0

謝謝! 其很好。 –

1

我不認爲這個SQL會編譯。看看你的GROUP BY說法,你應該GROUP BY您選擇的字段:

GROUP BY ex.ID, ex.ExpenseName , om.Taka 

另外,我不認爲你正打算要使用SUM運算符和GROUP BY運營商在同一個領域。不知道還有什麼可能發生。

+0

ex.ID和om.OfficeExpenseID只是兩個不同表的主鍵和外鍵。 –

+0

如果我將[om.YearMonthID <= ym.ID]更改爲[om.YearMonthID> = ym.ID],則此查詢正確顯示它應該是什麼。 –

+0

該語法在MySQL中有效。這是一個名爲「隱藏列」的(錯誤)功能。 –

1

由於您的選擇字段(om.taka)是用於組功能(sum(om.taka))中的字段,因此您在查詢時運行它會得到不同的結果。這就是我的意思。讓說,你有這樣的:

 
mysql> select * from foo; 
+------+------+ 
| a | b | 
+------+------+ 
| 1 | 2 | 
| 1 | 3 | 
+------+------+ 

,如果你使用的字段是在分組功能做一個選擇,你可以得到這樣的:

取決於MySQL的是如何決定對其中的順序順序行。具體來說,看到這個:

 
mysql> select a, b, sum(b) from foo group by a; 
+------+------+--------+ 
| a | b | sum(b) | 
+------+------+--------+ 
| 1 | 2 |  5 | 
+------+------+--------+ 
1 row in set (0.01 sec) 

但是,這是因爲處理行的順序。如果順序顛倒了,那麼你會得到不同的結果。

 
mysql> select a, b, sum(b) from (select * from foo order by b asc) t group by a; 
+------+------+--------+ 
| a | b | sum(b) | 
+------+------+--------+ 
| 1 | 2 |  5 | 
+------+------+--------+ 
1 row in set (0.00 sec) 

mysql> select a, b, sum(b) from (select * from foo order by b desc) t group by a; 
+------+------+--------+ 
| a | b | sum(b) | 
+------+------+--------+ 
| 1 | 3 |  5 | 
+------+------+--------+ 
1 row in set (0.01 sec) 

mysql> 

本課是如果您選擇在組功能中使用的字段,您將得到任意結果。