如何获取 SQL 中列的总和?

How to get sum totals of columns in SQL?

我写了一个存储过程,当我给发票号时,它 returns 我会影响两个帐户。作为输入参数。

SELECT A.AccountTitle,
       T.VoucherNumber, 
       T.ChequeNumber, 
       T.Particulars, 
       T.DR, 
       T.CR, 
       WU.UserName as Operator
FROM   dbo.Accounts A
INNER JOIN dbo.Transactions T ON T.Account_ID= A.AccountID
INNER JOIN dbo.Web_Users WU ON WU.UserID= T.User_ID
WHERE T.InvoiceNo= @InvoiceNo

输出:

AccountTitle    VoucherNumber   ChequeNumber    Particulars DR  CR  Operator
Conductor       NULL        NULL                New entry   100 0   Irfan
Jamal Acount    NULL        NULL                New entry1  0   100 Irfan

但我想要最后的 DR 和 CR 字段的总计。

预期输出

 AccountTitle   VoucherNumber   ChequeNumber    Particulars DR  CR  Operator
 Conductor      NULL           NULL             New entry   100 0   Irfan
 Jamal Acount   NULL           NULL             New entry1  0   100 Irfan
                                                    Total   100 100 

您可以使用 SUM 函数来计算总的 DR 和 CR,其他列的空值和 UNION ALL 运算符来组合结果集2 select 个语句中的一个。

像这样:

SELECT A.AccountTitle,
       T.VoucherNumber, 
       T.ChequeNumber, 
       T.Particulars, 
       T.DR, 
       T.CR, 
       WU.UserName as Operator
FROM   dbo.Accounts A
INNER JOIN dbo.Transactions T ON T.Account_ID = A.AccountID
INNER JOIN dbo.Web_Users WU   ON WU.UserID= T.User_ID
WHERE  T.InvoiceNo= @InvoiceNo
UNION ALL    
SELECT ''        AS AccountTitle, 
       NULL      AS VoucherNumber, 
       NULL      AS ChequeNumber, 
       'Total'   AS Particulars,
       CAST(SUM(T.DR) AS MONEY) AS DR,
       CAST(SUM(T.CR) AS MONEY) AS CR,
       ''        AS Operator
FROM   dbo.Accounts A
INNER JOIN dbo.Transactions T ON T.Account_ID= A.AccountID
INNER JOIN dbo.Web_Users WU   ON WU.UserID= T.User_ID
WHERE  T.InvoiceNo= @InvoiceNo

您可以使用 WITH ROLLUP 达到您想要的结果。见下文:

SELECT
     CASE WHEN GROUPING(T.Particulars)=1 THEN '' ELSE MIN(A.AccountTitle) END AccountTitle,
     CASE WHEN GROUPING(T.Particulars)=1 THEN '' ELSE MIN(T.VoucherNumber) END VoucherNumber,
     CASE WHEN GROUPING(T.Particulars)=1 THEN '' ELSE MIN(T.ChequeNumber) END ChequeNumber,
     CASE WHEN GROUPING(T.Particulars)=1 THEN 'TOTAL' ELSE MIN(T.Particulars) END Particulars, 
     SUM(CONVERT(MONEY,T.DR)) AS DR, 
     SUM(CONVERT(MONEY,T.CR)) AS CR,
     CASE WHEN GROUPING(T.Particulars)=1 THEN '' ELSE WU.UserName END Operator
FROM dbo.Accounts A
INNER JOIN dbo.Transactions T ON T.Account_ID= A.AccountID
INNER JOIN dbo.Web_Users WU ON WU.UserID= T.User_ID
WHERE T.InvoiceNo= @InvoiceNo
GROUP BY WU.UserName WITH ROLLUP