【问题标题】:mySQL debit credit balancesmySQL 借方贷方余额
【发布时间】:2012-10-12 02:26:05
【问题描述】:

是否有可能有一个 mySQL 查询来获取这些字段旧余额(我的费用总和)、借方(我应该在这里输入当前日期具有相同 ID 的总费用)、贷方(在这些查询中不多) , 新余额(与借方相同)。

现在当一天结束时,新余额将添加到旧余额中,并为当前日期形成新余额。我有我的代码,但它不计算我以前的余额。

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

【问题讨论】:

    标签: mysql sum


    【解决方案1】:

    您好,我提供了两个查询:一个是日期类型列,另一个是字符串。

    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 |
    

    【讨论】:

      【解决方案2】:

      另一个例子说明为什么 mysql 应该强制所有 GROUP BY 子句的 SELECT 只包含 GROUP BY 子句中指定的列,或者被聚合函数包围。 Mysql 将此 bug 称为“功能”。

      我的意思是,看看你的两个 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 parentid, value FROM test GROUP BY parentid, value

      好吧,我们还没有说如何处理 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 
      

      【讨论】:

      • 嗨,我已经编辑了我的帖子..您可以帮我整理一下..如果我删除子查询中的字段,我无法将它链接到我加入的主查询中。 .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多