MySQL包含Grandtotal的行小计

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 |

我需要创建一个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

您可以尝试使用
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,非常有魅力谢谢您的问候