0

mySQLクエリを使用して、これらのフィールドの古い残高(経費の合計)、借方(現在の日付に同じIDの経費の合計を入力する必要があります)、クレジット(これらのクエリにはあまり含まれていません)、新しい残高を取得することはできますか? (借方と同じ)。

これで、1日が終了すると、新しい残高が古い残高に追加され、現在の日付の新しい残高が形成されます。コードはありますが、以前の残高は計算されません。

テーブル:rf_expenses

--------------------------------------
id_rf_expenses   rf_expense_desc
--------------------------------------
1                    salary
2                    bonus
3                    transportation

表:経費

-----------------------------------------------------------
id_expnses    id_rf_expenses     expense_amt   expense_date
------------------------------------------------------------
1                1                  100           current
2                1                  100           yesterday
3                2                   50           current
4                2                   50           current
5                3                  200           yesterday

出力:

-----------------------------------------------------------
EXPENSE      OLD BALANCE    DEBIT     CREDIT   NEW BALANCE
-----------------------------------------------------------
SALARY           100         100        0          100          
BONUS             0          100        0          100
TRANSPO          200           0        0            0

これは、現在の日付のすべてのクエリで発生します。現在の日付より前の日付は、古い残高に合計されます。

SELECT 
    r.rf_expense_desc, 
    COALESCE(SUM(expense_amt), 0) - COALESCE(q1.amt2, 0) OLD, 
    COALESCE(q1.amt2, 0) AS NEW
FROM 
    rf_expenses r
LEFT JOIN 
    expenses e ON r.id_RF_expense = e.id_rf_expense
LEFT JOIN 
    (SELECT 
         SUM(expense_amt) amt2, id_expense, 
         rf_expenses.id_rf_expense
     FROM 
         rf_expenses
     LEFT JOIN 
         expenses ON rf_expenses.id_RF_expense = expenses.id_rf_expense
     WHERE 
         expense_date = CURDATE( ) 
     GROUP BY 
         rf_expense_desc, expense_date) q1 ON r.id_rf_expense = q1.id_rf_expense
GROUP BY 
    rf_expense_desc 
4

2 に答える 2

3

こんにちは、2 つのクエリを指定します。1 つは日付型の列で、もう 1 つは文字列です。

1 クエリ (サンプル データを使用) SQLFIDDLE の例:

    SELECT 
rf.rf_expense_desc as EXPENSE      
,(SELECT 
  COALESCE(SUM(e.expense_amt),0)
  FROM expenses e
  WHERE e.id_rf_expenses= rf.id_rf_expenses
  AND expense_date != 'current'
 ) AS 'OLD BALANCE'
,(SELECT 
  COALESCE(SUM(e.expense_amt),0)
  FROM expenses e
  WHERE e.id_rf_expenses= rf.id_rf_expenses
  AND expense_date = 'current'
 ) AS 'DEBIT'
,0 AS CREDIT
,(SELECT 
  COALESCE(SUM(e.expense_amt),0)
  FROM expenses e
  WHERE e.id_rf_expenses= rf.id_rf_expenses
  AND expense_date = 'current'
 ) AS 'NEW BALANCE'
FROM 
rf_expenses rf

2 クエリ (データ型は日付) SQLFIddle example2 :

SELECT 
rf.rf_expense_desc as EXPENSE      
,(SELECT 
  COALESCE(SUM(e.expense_amt),0)
  FROM expenses e
  WHERE e.id_rf_expenses= rf.id_rf_expenses
  AND expense_date != CURDATE()
 ) AS 'OLD BALANCE'
,(SELECT 
  COALESCE(SUM(e.expense_amt),0)
  FROM expenses e
  WHERE e.id_rf_expenses= rf.id_rf_expenses
  AND expense_date = CURDATE()
 ) AS 'DEBIT'
,0 AS CREDIT
,(SELECT 
  COALESCE(SUM(e.expense_amt),0)
  FROM expenses e
  WHERE e.id_rf_expenses= rf.id_rf_expenses
  AND expense_date = CURDATE()
 ) AS 'NEW BALANCE'
FROM 
rf_expenses rf

結果:

|        EXPENSE | OLD BALANCE | DEBIT | CREDIT | NEW BALANCE |
---------------------------------------------------------------
|         salary |         100 |   100 |      0 |         100 |
|          bonus |           0 |   100 |      0 |         100 |
| transportation |         200 |     0 |      0 |           0 |
于 2012-10-12T06:45:45.833 に答える
0

mysql がすべての GROUP BY 句の SELECT を強制して、GROUP BY 句で指定された列のみを持つようにするか、または集計関数で囲まれるようにする必要がある理由のさらに別の例です。Mysql 呼び出しは、このバグを「機能」と呼んでいます。

つまり、内部クエリと外部クエリの両方の GROUP BY の SELECT 句を見てください。GROUP BY 句になく、SUM、AVG、COUNT、またはその他の集計関数で囲まれていない列を選択しています。行をグループ化し、グループ内の行を「削減」する方法を mysql に指示しない場合、単純に任意の値がランダムに取得されます。

たとえば、「test」というテーブルに次のデータがあるとします。

PARENTID     ID     VALUE
-------------------------
1            1      2.05
1            2      3.50
1            3      1.58
2            1      4.65
2            2      0.65

クエリ: SELECT 親 ID、値 FROM テスト GROUP BY 親 ID、値

SUM などの VALUE 列をどうするかについては述べていません。そのため、mysql は単純にグループ内の任意の値を取得します。それらの多く。

したがって、これは正しいです:

SELECT parentid, SUM(value) as total FROM test GROUP BY parentid, value;

mysql が各グループを減らすと、正しい合計が得られ、結果は次のようになります。

PARENTID          VALUE
-------------------------
1                 7.13
2                 5.30

したがって、あなたの例では、おそらく次のクエリを実行する必要があります。

SELECT r.rf_expense_desc, expense_date,
    COALESCE( SUM( expense_amt ) , 0 ) - COALESCE( sum(q1.amt2), 0 ) OLD, COALESCE( sum(q1.amt2), 0 ) AS NEW
FROM rf_expenses r
LEFT JOIN expenses e ON r.id_RF_expense = e.id_rf_expense
LEFT JOIN (
    SELECT SUM( expense_amt ) amt2, count(id_expense) as counts
    FROM rf_expenses
    LEFT JOIN expenses ON rf_expenses.id_RF_expense = expenses.id_rf_expense
    WHERE expense_date = CURDATE( ) 
    GROUP BY rf_expense_desc, expense_date
) q1 ON r.id_rf_expense = q1.id_rf_expense
GROUP BY rf_expense_desc 
于 2012-10-12T02:44:59.460 に答える