【问题标题】:TSQL - SQL Server 2014 - Sums based on different parametersTSQL - SQL Server 2014 - 基于不同参数的总和
【发布时间】:2017-11-22 14:01:55
【问题描述】:

我有一张包含销售详情的表格。

买家可以购买多件商品并一起付款:在这种情况下,OrderID 对所有商品都是一样的,PaymentAmountPaymentID 也一样

但他们可能会分两期付款,在这种情况下有不同的PaymentID(虽然付款金额可以相同)。

我需要根据PaymentAmountsQuantity*Price 之间的差异检查运费是否正确计算

相关栏目是:

| SaleID | OrderID | Quantity | Price | PaymentAmount | PaymentID | Shippingcost |
|  0001  |   001   |    3     |  3.50 |      13.50    |    BT123  |    3.00      |
|  0002  |   002   |    1     |  1.50 |      13.50    |    BB331  |    5.50      |
|  0003  |   002   |    5     |  2.00 |      13.50    |    BB331  |    5.50      |
|  0004  |   002   |    2     |  5.00 |      13.50    |    BB332  |    5.50      |
|  0005  |   003   |    1     |  3.00 |      12.50    |    BV444  |    4.00      |
|  0006  |   003   |    1     |  5.50 |      12.50    |    BV444  |    4.00      |

因此对于相同的

订单编号

我需要将不同PaymentID的付款金额相加,并且我必须将所有数量和价格相加:

因此,对于 OrderID 002,我期望:

TotalPayments 27.00  
TotalGoods    21.50  
ShippingCosts  5.50 

到目前为止,我的解决方案如下所示:

declare @OrderID nvarchar(10)='0002'

select distinct
    paymentAmount,
    sum (quantitypurchased*currentprice) over (partition by OID) TotalGoods
from 
    Sales s
where 
    OrderID = @OrderID

declare @OrderID nvarchar(10) = '0002'

select distinct
    sum(paymentAmount) over () TotalPayments,
    sum (quantitypurchased * currentprice) over (partition by OID) TotalGoods
from 
    Sales s
where 
    OrderID = @OrderID

问题是第一个解决方案没有返回总数,尽管有正确的数字来计算它。

但主要问题是返回超过 1 行,而为了进一步处理,我需要将总货物和总付款放在一行中

虽然第二个返回一行中的总数,但 TotalPayments 是错误的,因为值被添加了超过 1 次。

而且我很确定这可以通过更多的技能“轻松”实现..

可以帮忙吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    我认为窗口函数可以帮助您隔离需要参与计算的行:

    select s.orderid,
           sum(case when seqnum = 1 then paymentamount else 0 end) as totalpayments,
           sum(quantity * price) as totalprice,
           max(shippingcost) as shippingcost
    from (select s.*,
                 row_number() over (partition by s.orderid, s.paymentid order by saleid) as seqnum
          from sales s
         ) s
    group by s.orderid;
    

    【讨论】:

      【解决方案2】:

      我想出了与 Gordon 的答案相同的逻辑,但我使用了 CTE。

      ;With CTE
      As
      (
          Select 
              OrderID,
              Quantity,
              Price,
              PaymentAmount,
              ShippingCost,
              ROW_NUMBER() Over(Partition By OrderID, PaymentID Order By OrderID) As RowNum
          From Sales
      )
      Select 
          OrderID,
          Sum(Case When RowNum = 1 Then PaymentAmount End) As TotalPayments,
          Sum(Quantity * Price) As TotalCosts,
          Max(ShippingCost) As ShippingCost
      From CTE
      Group By OrderID
      Order By OrderID;
      

      【讨论】:

        猜你喜欢
        • 2019-06-06
        • 2018-12-01
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 2021-05-05
        相关资源
        最近更新 更多