【问题标题】:How to get the sum of a column value as a new column in the SQL result set如何获取列值的总和作为 SQL 结果集中的新列
【发布时间】:2019-01-22 04:59:35
【问题描述】:

我有一个称为付款计划的表格,我需要得到下表中的结果集。

CREATE TABLE PaymentPlans
(
PaymentPlanID           int, 
EmployeeID              int,        
PaidToDate              money
)

INSERT INTO PaymentPlans VALUES (1,1,100)
INSERT INTO PaymentPlans VALUES (2,1,200)
INSERT INTO PaymentPlans VALUES (3,1,150)

在我的选择查询中,我需要一个额外的列来为我提供“PaidToDate”的总和。我正在尝试使用以下查询,其中我得到的结果集是“支付总额”,与“迄今为止支付”相同。

SELECT PaymentPlanID, EmployeeID, PaidToDate, SUM(PaidToDate) AS 'TOTAL AMOUNT PAID' FROM PaymentPlans group by PaymentPlanID, EmployeeID, PaidToDate

SELECT a.PaymentPlanID, a.EmployeeID, a.PaidToDate, SUM(a.PaidToDate) AS 
'TOTAL AMOUNT PAID' FROM (
SELECT PaymentPlanID, EmployeeID, PaidToDate FROM PaymentPlans
)a
GROUP BY a.PaymentPlanID, a.EmployeeID, a.PaidToDate

在这两种情况下,我得到的结果如下,

PaymentPlanID   EmployeeID  PaidToDate  TotalAmountPaid
1               1           100.00      100.00
2               1           200.00      200.00
3               1           150.00      150.00

我需要的结果如下,

PaymentPlanID EmployeeID    PaidToDate    TotalAmountPaid
1             1             100.00        450.00
2             1             200.00        450.00
3             1             150.00        450.00

请让我知道我的查询中缺少什么。

【问题讨论】:

  • 在样本数据中添加另一个EmployeeID,并相应地调整预期结果。
  • 在示例数据中添加另一个 EmployeeID !!!

标签: sql sql-server


【解决方案1】:

您可以使用OVER 子句。您可能需要包含 PARTITION BY 子句,具体取决于您的要求。

SELECT PaymentPlanID,
       EmployeeID,
       PaidToDate,
       SUM(PaidToDate) OVER () AS TotalAmountPaid
FROM dbo.PaymentPlans;

【讨论】:

  • 嗯,我想他想按 EmployeeID 分区
  • @Esperento57 很可能,但是,我们在样本中只有一名员工和预期结果。因此,为什么我在答案中提到了PARTITION BY。他们没有在他们的问题中提到它,所以这完全是猜测。
  • 是的,我知道,但他可以认为没关系,但只有当他只有一个用户进入表时才可以:)
【解决方案2】:

你可以试试下面的方法

select *,(select sum(PaidToDate) from  PaymentPlans) as total from PaymentPlans 

PaymentPlanID   EmployeeID  PaidToDate  total
1                  1         100.00    450.00
2                  1         200.00    450.00
3                  1        150.00     450.00

【讨论】:

    【解决方案3】:

    如果您有多个客户 ID,并且您希望每一行都支付该客户的总金额,您需要加入子查询,如下所示

    SELECT 
       a.PaymentPlanID, 
       a.EmployeeID, 
       a.PaidToDate, 
       b.TotalPaidToDate AS 'TOTAL AMOUNT PAID' 
    FROM PaymentPlans a
    INNER JOIN ( 
        SELECT 
           EmployeeID, 
           SUM(PaidToDate) AS TotalPaidToDate 
        FROM PaymentPlans 
        GROUP BY EmployeeID
    ) b
    ON a.EmployeeID = b.EmployeeID
    

    【讨论】:

      【解决方案4】:

      我会使用Over 子句,如果基础记录更多,它可能会快速执行。

      SELECT 
            PaymentPlanID,EmployeeID,
            PaidToDate,SUM(PaidToDate) OVER () as total
      FROM PaymentPlans
      

      【讨论】:

        【解决方案5】:

        为了完成与拉努的讨论,

        方法一:

        SELECT PaymentPlanID,
               EmployeeID,
               PaidToDate,
               SUM(PaidToDate) OVER (partition by EmployeeID order by PaymentPlanID) AS TotalAmountPaidByEmployeeID,
               SUM(PaidToDate) OVER () AS TotalAmountPaid
        FROM dbo.PaymentPlans;
        

        方法二:

        with Total as 
        (
        select EmployeeID, sum(PaidToDate) TotalAmountPaidByEmployeeID
        from dbo.PaymentPlans
        group by EmployeeID
        )
        SELECT f1.*, f2.TotalAmountPaidByEmployeeID
        FROM dbo.PaymentPlans f1 inner join Total f2 on f1.EmployeeID=f2.EmployeeID;
        

        方法三

        SELECT f1.*, f3.TotalAmountPaidByEmployeeID
        FROM dbo.PaymentPlans f1
        cross apply
        (
          select sum(PaidToDate) TotalAmountPaidByEmployeeID from dbo.PaymentPlans f2
          where f1.EmployeeID=f2.EmployeeID
        ) f3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-07
          • 1970-01-01
          • 2014-03-23
          • 2013-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多