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. Taka] 与えられた [ym.Year_Month] と sum[om. Taka] - 指定された Year_Month までの以前のすべてのタカの合計。om.ID でグループ化

これで、最初の Year_Month の「タカ」が表示されます (たとえば、3 月の「タカ」と 3 月までの合計 (「タカ」) を見たい場合は、1 月の「タカ」(yyyy_mm テーブルの最初のエントリ) が表示されます)マーチ用ではありませんが、私が提供したものではなく、私が見たいものを正確に表示しています。しかし、指定された年月まで合計(タカ)!

しかし、昨日とまったく同じ結果を示しています!しかし、私はこれで何も変更しませんでした.なぜそれが今違うのか分かりません..

誰でも私を助けることができます!

4

3 に答える 3

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

このクエリはテストしていないため、構文エラーが発生する可能性があります。

于 2013-01-11T20:28:09.653 に答える
1

このSQLはコンパイルされないと思います。あなたのGROUP BY声明を見てください、あなたはGROUP BYあなたが選択しているフィールドをすべきです:

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

また、同じフィールドでSUM演算子とGROUPBY演算子を使用するつもりはないと思います。他に何が起こっているのかわからない。

于 2013-01-11T19:44:27.797 に答える
1

om.taka選択フィールド ( ) はグループ関数 ( ) で使用されるフィールドであるため、クエリを実行すると異なる結果が得られますsum(om.taka)。これが私の言いたいことです。あなたがこれを持っているとしましょう:

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

グループ関数にあるフィールドを使用して選択を行うと、次のようになります。

mysqlが行の順序をどのように決定したかによって異なります。具体的には、これを参照してください。

mysql> a, b, sum(b) を foo グループから a; で選択します。
+--------+--------+--------+
| | | | b | 合計(b) |
+--------+--------+--------+
| | 1 | 2 | 5 |
+--------+--------+--------+
セットで 1 行 (0.01 秒)

しかし、それは行が処理された順序によるものです。順序を逆にすると、別の結果が得られます。

mysql> select a, b, sum(b) from (select * from foo order by b asc) t group by a;
+--------+--------+--------+
| | | | b | 合計(b) |
+--------+--------+--------+
| | 1 | 2 | 5 |
+--------+--------+--------+
セットで 1 行 (0.00 秒)

mysql> select a, b, sum(b) from (select * from foo order by b desc) t group by a;
+--------+--------+--------+
| | | | b | 合計(b) |
+--------+--------+--------+
| | 1 | 3 | 5 |
+--------+--------+--------+
セットで 1 行 (0.01 秒)

mysql>

教訓は、グループ機能で使用しているフィールドを選択している場合、任意の結果が得られるということです。

于 2013-01-11T20:26:24.347 に答える