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 行的小计与总计的主要内容,如果未能解决你的问题,请参考以下文章