【问题标题】:How to get sum totals of columns in SQL?如何获取 SQL 中列的总和?
【发布时间】:2015-05-07 17:41:53
【问题描述】:

我编写了一个存储过程,当我提供发票编号时,它会返回两个帐户的效果。作为输入参数。

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 

【问题讨论】:

    标签: sql asp.net sql-server tsql gridview


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      【解决方案2】:

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

      类似这样的:

      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
      

      【讨论】:

      • error 所有使用 UNION、INTERSECT 或 EXCEPT 运算符组合的查询在其目标列表中必须有相同数量的表达式。
      • 立即尝试,将 " 更改为 ' 也应该为 NULL,其中您的列类型为整数。编辑了我的答案。哦,对不起,我忘记了操作员
      • 您收到的那个错误是因为我错过了添加运算符列,现在试试,应该没问题。
      • 错误无法将 char 值转换为货币。 char 值的语法不正确。注意:CR、DR 的类型为 MONEY
      • 使用UNION ALL最终会导致SQL性能问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2016-09-24
      • 2015-02-21
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多