MySQL 行的小计与总计

Posted

技术标签:

【中文标题】MySQL 行的小计与总计【英文标题】:MySQL Subtotals of Rows with Grandtotal 【发布时间】:2017-08-09 06:17:22 【问题描述】:

我需要创建一个 MariaDB SQL,它允许我对两列(借方和贷方列)求和以获得差异,并返回每个不同帐户类型的小计。表格如下:

 Account     | Debit  | Credit
 acc1        |   1    |   2 
 acc1        |   1    |   4
 acc2        |   3    |   2
 acc2        |   2    |   1
 acc2        |   2    |   1
 acc3        |   5    |   2
 acc3        |   5    |   1
 acc3        |   5    |   2

我想返回以下内容:

 Account     | Balance(debit-credit)
 acc1        |   -1    
 acc1        |   -3 
 -------------------------------
 Total acc1  |   -4 
 -------------------------------
 acc2        |   1
 acc2        |   1
 acc2        |   1
 -------------------------------
 Total acc2  |   3 
 -------------------------------
 acc3        |   3
 acc3        |   4
 acc3        |   3
 -------------------------------
 Total acc3  |   10 
 -------------------------------
 GrandTotal  |   9 
 -------------------------------

 Grandtotal is Totals of acc1 + acc2 + acc3

这是我到目前为止所尝试的,但我只得到总计而没有小计

SELECT * FROM (
 SELECT COALESCE(account,'TOTAL') AS Account, CASE
        WHEN account LIKE 'INC%' 
            THEN sum((gl.credit - gl.debit))
        ELSE sum((gl.debit - gl.credit))
    END AS Balance
 FROM `tabGL Entry` gl
 WHERE (NOT (account LIKE 'CASS%')
     AND NOT (account LIKE 'CLIA%')
     AND NOT (account LIKE 'FASS%'))
 GROUP BY account WITH ROLLUP
) AS gl
 ORDER BY CASE
     WHEN account LIKE 'INC%' THEN 1
     WHEN account LIKE 'DCOI%' THEN 2
     WHEN account LIKE 'DMC%' THEN 3
     WHEN account LIKE 'INFC%' THEN 4
     WHEN account LIKE 'IDEX%' THEN 5
     ELSE 6
 END

【问题讨论】:

我真的无法想象在借方和贷方有相邻列的情况。除此之外,您忘记了包含您的 PRIMARY KEY,它的缺失基本上使这个问题无法解决。 @Strawberry,我正在使用的数据库是这样设计的,所以必须使用它。帐户类型是我可以使用的唯一依据,主键本身不是键。为什么会不溶?。问候 为了一个解决方案,让我们忽略上面的sql语句并使用我上面指出的伪表结果,我将如何编写sql语句? 恐怕这太做作了。如果您没有 PRIMARY KEY,那么您就没有真正的表。如果你真的没有表,那么这不是一个真正的 RDBMS 问题 @Strawberry,实际上我在所有方面都做了,并且它确实拥有它的主键。我基于一个全新的 sql 语句询问的原因是因为显然我没有返回所需的结果。这就是为什么我问是否有另一种方法来处理我指出的声明。这绝对不是人为的。 【参考方案1】:

你可以试试UNION,比如:

SELECT * 
  FROM (SELECT COALESCE('TOTAL ', account) AS Account
               , SUM(CASE WHEN account LIKE 'INC%' 
                          THEN (gl.credit - gl.debit)
                          ELSE (gl.debit - gl.credit)
                      END) AS Balance
          FROM `tabGL Entry` gl
         WHERE (NOT (account LIKE 'CASS%')
           AND NOT (account LIKE 'CLIA%')
           AND NOT (account LIKE 'FASS%'))
         GROUP BY account WITH ROLLUP
  -- UNION SELECT account
  --              , CASE WHEN account LIKE 'INC%' 
  --                     THEN (gl.credit - gl.debit)
  --                     ELSE (gl.debit - gl.credit)
  --                 END AS Balance
  --         FROM `tabGL Entry` gl
  --        WHERE (NOT (account LIKE 'CASS%')
  --          AND NOT (account LIKE 'CLIA%')
  --          AND NOT (account LIKE 'FASS%'))
) AS gl
 ORDER BY CASE
 WHEN account LIKE 'INC%' THEN 1
 WHEN account LIKE 'DCOI%' THEN 2
 WHEN account LIKE 'DMC%' THEN 3
 WHEN account LIKE 'INFC%' THEN 4
 WHEN account LIKE 'IDEX%' THEN 5
 ELSE 6
END

我认为这应该做你想做的事

注释掉的部分是单行,上半部分是小计

现在在此处的最后一条评论之后,为您提供小计和总计的查询

按 COALESCE 分组似乎是个问题,所以现在由 LEFT(account,3) 完成,ORDER 语句必须修改为 3 个字符

SELECT * 
  FROM (SELECT LEFT(account,3) AS Account
           , SUM(CASE WHEN account LIKE 'INC%' 
                      THEN (credit - debit)
                      ELSE (debit - credit)
                  END) AS Balance
          FROM acc
         GROUP BY LEFT(account,3) WITH ROLLUP
) AS ac
 ORDER BY CASE
 WHEN account LIKE 'INC%' THEN 1
 WHEN account LIKE 'DCO%' THEN 2
 WHEN account LIKE 'DMC%' THEN 3
 WHEN account LIKE 'INF%' THEN 4
 WHEN account LIKE 'IDE%' THEN 5
 ELSE 6
END

【讨论】:

RealCheeseLord。我试过你的答案,不幸的是没有按预期工作,结果是重复行。感谢您的反馈 哪些行是重复的?您没有发布所有专栏,所以我不知道您的 GROUP 密钥。 在这种情况下,GROUP 键是帐户列。您的报表结果显示所有帐户,而不仅仅是特定帐户的总和。例如 -- 假设 acc1 有 100 条记录,则显示所有 100 条记录,而不是 acc1 的总和。在声明中,我给出的帐户将是“INC”、“DCOI”、“DMC”、“INFC”和“IDEX”,并且我根据帐户列进行分组。 -- 谢谢和问候 啊,我看错了你的问题,我编辑了,这应该给你小计。 SUM 在您的 CASE 之外 真棒@RealCheeseLord,工作就像一个魅力非常感谢你的问候

以上是关于MySQL 行的小计与总计的主要内容,如果未能解决你的问题,请参考以下文章

Magento 2 / 价格和小计 4 位小数 但增值税和总计 2 位小数

表 Javascript 中的小计和总计数

MS ACCESS:从总计小计中排除主要组的小计

计算所有项目总计到小计 Jquery

Oracle 中总计和小计使用的函数

实战 SQL:销售数据的小计/合计/总计以及数据透视表