2013-01-11 32 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> 

本课是如果您选择在组功能中使用的字段,您将得到任意结果。