首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL Server中获取列的总和并在单个查询中显示?

如何在SQL Server中获取列的总和并在单个查询中显示?
EN

Stack Overflow用户
提问于 2021-01-11 14:17:40
回答 2查看 51关注 0票数 2

我有这张表,我有三个特定的交易:账单,罚款和折扣。我想计算账单金额((账单-折扣)+罚金)。

代码语言:javascript
复制
| CustNumber | Particular | Amount |
| 1001       | Billing    | 170.00 |
| 1001       | Penalty    | 17.00  |
| 1001       | Discount   | 8.50   |
| 1002       | Billing    | 250.00 |
| 1002       | Penalty    | 25.00  |
| 1002       | Discount   | 12.50  |
| 1003       | Billing    | 500.00 |
| 1003       | Penalty    | 50.00  |
| 1003       | Discount   | 25.00  |
| 1004       | Billing    | 200.00 |
| 1004       | Penalty    | 20.00  |
| 1004       | Discount   | 10.00  |

这应该是输出

代码语言:javascript
复制
| CustNumber | BilledAmount |
| 1001       | 178.50       |
| 1002       | 262.50       |
| 1003       | 525.00       |
| 1004       | 210.00       |

到目前为止,我尝试的是:我设法获得了每个帐户的账单金额:

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[spComputeBilledAmount]
    @CustId int
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @billing decimal(18,2),
            @penalty decimal(18,2),
            @discount decimal(18,2)

    SELECT 
        @billing = COALESCE(SUM(CASE WHEN particulars = 'Billing' THEN [Amount] ELSE 0 END), 0),
        @penalty = COALESCE(SUM(CASE WHEN particulars = 'Penalty' THEN [Amount] ELSE 0 END), 0),
        @discount = COALESCE(SUM(CASE WHEN particulars = 'Discount' THEN [Amount] ELSE 0 END), 0)
    FROM
        [Transactions]
    WHERE 
        [ConcessionaireId] = @CustId
                            
    SELECT ((@billing-@discount)+ @penalty)  AS 'BilledAmount'
END
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-11 14:20:41

我将在这里使用条件聚合:

代码语言:javascript
复制
SELECT
    CustNumber,
    MAX(CASE WHEN Particular = 'Billing' THEN Amount ELSE 0 END) +
    MAX(CASE WHEN Particular = 'Penalty' THEN Amount ELSE 0 END) -
    MAX(CASE WHEN Particular = 'Discount' THEN Amount ELSE 0 END) AS BilledAmount
FROM [Transactions]
GROUP BY
    CustNumber;
票数 5
EN

Stack Overflow用户

发布于 2021-01-11 14:28:46

您的存储过程一次只处理一个CustNumber。这是不切实际的,你不需要存储过程来做这件事。

代码语言:javascript
复制
SELECT t.CustNumber,
       SUM 
       ( 
           CASE Particular
           WHEN 'Billing'  THEN +t.Amount 
           WHEN 'Penalty'  THEN +t.Amount 
           WHEN 'Discount' THEN -t.Amount 
           END
       ) AS BilledAmount 
FROM   [Transactions] t
GROUP BY t.CustNumber 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65662164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档