MySQL包含Grandtotal的行小计
我需要创建一个MariaDB SQL,它允许我对两列(借方和贷方列)求和以获得差额,并返回每个不同帐户类型的小计。下表如下:MySQL包含Grandtotal的行小计,mysql,sql,mariadb,Mysql,Sql,Mariadb,我需要创建一个MariaDB SQL,它允许我对两列(借方和贷方列)求和以获得差额,并返回每个不同帐户类型的小计。下表如下: Account | Debit | Credit acc1 | 1 | 2 acc1 | 1 | 4 acc2 | 3 | 2 acc2 | 2 | 1 acc2 | 2 | 1 acc3 |
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
您可以尝试使用
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
我想这应该是你想要的
注释掉的部分用于单行,上部用于小计
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
现在,在这里的最后一个注释之后,查询将提供小计和总计
按合并进行分组似乎是个问题,因此现在由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
我真的无法想象在什么情况下,借方和贷方会有相邻的列。除此之外,您忘了包含主键,主键的缺失基本上使这个问题无法解决。@草莓,我正在使用的db就是这样设计的,所以必须使用它。帐户类型是我可以使用的唯一依据,主键本身不是键。为什么它是不溶的?。为了解决这个问题,让我们忽略上面的sql语句,使用我在上面指出的伪表结果,我将如何编写sql语句?恐怕这将是相当做作的。如果没有主键,那么就没有真正的表。如果您没有真正的表,那么这不是真正的RDBMSquestion@Strawberry,实际上,我在所有计数上都是这样的,并且它确实有主键。我之所以根据一个全新的sql语句提问,显然是因为我的sql语句没有返回所需的结果。这就是为什么我问是否有其他方法来处理我指出的声明。这绝对不是人为的。我尝试了你的答案,不幸的是没有按预期工作,结果是重复行。感谢您的反馈,哪些行是重复的?您没有发布所有列,因此我不知道您的
组
键。在本例中,组
键是Account列。您对账单的结果是显示所有账户,而不仅仅是特定账户的总和。例如,假设acc1有100条记录,则显示所有100条记录,而不是acc1的总和。在对账单中,我给出的账户是“INC”、“DCOI”、“DMC”、“INFC”和“IDEX”,我是根据账户列进行分组的谢谢&Regardsah,我看错了你的问题,我编辑了,这应该给你小计SUM
在您的案例之外
Awesome@realcheselord,非常有魅力谢谢您的问候