mysql查询 - 没有得到它应该提供的结果

时间:2013-01-11 19:40:34

标签: mysql sql

    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。Taka]给定[ym.Year_Month]和sum [om。Taka] - 即所有之前Taka的总和,直到给定的Year_Month。按om.ID分组

现在,它显示了第一个Year_Month的'Taka'(例如,如果我想看到'taka'的行军和总和('Taka')直到3月,它显示我1月的'Taka'(第一个进入yyyy_mm表)不是为了游行。但显示总和('Taka')正是我想要看到的)而不是我提供的那个。但总和(塔卡)直到给定的YearMonth。!

但它在昨天之前显示完全相同的结果!但是我没有改变任何东西,我现在不知道它为什么显示不同......

任何人都可以帮助我!

3 个答案:

答案 0 :(得分: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

我没有测试过此查询,因此可能会出现语法错误。

答案 1 :(得分:1)

我不认为这个SQL会编译。查看您的GROUP BY声明,您应该GROUP BY您选择的字段:

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

另外,我认为您不打算在同一个字段上使用SUM运算符和GROUP BY运算符。不知道还有什么可能发生。

答案 2 :(得分: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> 

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