2012-10-12 67 views
0

是否有可能有一個mySQL查詢來獲得這些字段舊的餘額(我的開支的總和),借記卡(這裏應該把我的費用總額與當前日期相同的id),信用(沒有太多在這些查詢中),新的餘額(與借方相同)。mySQL借記貸方餘額

現在當一天結束時,新的餘額將被添加到舊的餘額中,並且將爲當前日期形成新的餘額。我有我的代碼,但它不計算我以前的餘額。

表: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 

OUTPUT:

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

會發生這種情況目前date..any的每一個查詢日期以前的當前將總和在舊的餘額

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 

回答

3

您好,我給了兩個查詢:一個與日期類型列和另一個字符串。

1查詢(與樣品數據)SQLFIDDLE example

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 | 
+0

哇..冷靜謝謝男人..救救我.. – NeverendeR

0

爲什麼mysql應該強制所有GROUP BY子句的SELECT只有GROUP BY子句中指定的列,或者被聚合函數包圍的另一個例子。 Mysql調用這個bug是一個「功能」。

我的意思是,看看兩個你的GROUP BY,內部查詢和外部的SELECT子句。您有選擇的列不在GROUP BY子句中,並且沒有被SUM,AVG,COUNT或其他聚合函數包圍。如果你將行分組,並且你不告訴mysql如何「減少」組中的行,它將隨機取任何值。

例如,假設我們在一個名爲 「測試」 表中有這樣的數據:

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

的我們查詢: SELECT的parentid,值與測試GROUP BY的parentid,價值

嗯,我們還沒有說如何處理VALUE列,例如SUM,所以mysql會簡單地取得組中的任何值,對於PARENTID = 1,我們可以得到2.05,3.50或1.58中的任何一個,但不是它們的組合。

因此,這是正確的:

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 
+0

您好我已編輯我的帖子..可以幫助我整理出答案的問題,如果我刪除子查詢中的字段,我無法鏈接它,我加入了主要查詢.. – NeverendeR