如何获取 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
我写了一个存储过程,当我给发票号时,它 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