【问题标题】:sum 2 case functions while joining 3 tables sql sql server在加入 3 个表 sql sql server 时求和 2 个 case 函数
【发布时间】:2020-05-14 10:09:58
【问题描述】:

我正在尝试对我刚刚在查询中创建的两个 CASE 函数(案例语句中的 2 列 PotentialOrderGainPotentialFreightLoss)求和。我需要通过将这两个案例函数相加来创建一个新列作为 NetGainLoss。我知道我可以使用 cte 方法来做到这一点。但同时,我需要将 3 个表内部连接在一起。这 3 个表是 Person.AddressSales.SalesOrderHeaderSales.vIndividualCustomer。我不知道如何在一个大查询中实现所有这些。请在下面找到我的查询。非常感谢!

select h.SalesOrderID,
       i.StateProvinceName as ShipToState,
       h.OrderDate,
       h.SubTotal,
       h.Freight,
       case when h.SubTotal>=1500 and h.SubTotal<2000 then 2000-h.SubTotal
       when h.SubTotal<1500 then 0
       when h.SubTotal>=2000 then 0
       end as PotentialOrderGain,
       case when h.SubTotal>=1500 and h.SubTotal<2000 then 0.22-h.Freight
       when h.SubTotal<1500 then 0
       when h.SubTotal>=2000 then 0.22-h.Freight
       end as PotentialFreightLoss
from Sales.vIndividualCustomer i
inner join Person.Address a
on a.City = i.City
inner join Sales.SalesOrderHeader h
on a.AddressID = h.ShipToAddressID
where i.StateProvinceName='California'
order by h.SalesOrderID;

【问题讨论】:

标签: sql sql-server join case


【解决方案1】:
select h.SalesOrderID,
i.StateProvinceName as ShipToState,
h.OrderDate,
h.SubTotal,
h.Freight,
SUM
(case when h.SubTotal>=1500 and h.SubTotal<2000 then 2000-h.SubTotal
when h.SubTotal<1500 then 0
when h.SubTotal>=2000 then 0
end)
-
(case when h.SubTotal>=1500 and h.SubTotal<2000 then 0.22-h.Freight
when h.SubTotal<1500 then 0
when h.SubTotal>=2000 then 0.22-h.Freight
end)
as NetFreightLoss
from Sales.vIndividualCustomer i
inner join Person.Address a
on a.City = i.City
inner join Sales.SalesOrderHeader h
on a.AddressID = h.ShipToAddressID
where i.StateProvinceName='California'
group by
h.SalesOrderID,
i.StateProvinceName as ShipToState,
h.OrderDate,
h.SubTotal,
h.Freight
order by h.SalesOrderID;

【讨论】:

    【解决方案2】:

    这可能是一种缓慢/低效的方法,因为将大量数据带入第四次连接,但它应该为您提供一个起点:

    select 
        h.SalesOrderID
        ,i.StateProvinceName as ShipToState
        ,h.OrderDate
        ,h.SubTotal
        ,h.Freight
        ,SumTotals.PotentialOrderGain + SumTotals.PotentialFreightLoss as NetGainLoss
        from Sales.vIndividualCustomer i
        inner join Person.Address a on a.City = i.City
        inner join Sales.SalesOrderHeader h on a.AddressID = h.ShipToAddressID
        inner join (SELECT  ShipToAddressID,      
                case when h.SubTotal>=1500 and h.SubTotal<2000 then 2000-h.SubTotal
                when h.SubTotal<1500 then 0
                when h.SubTotal>=2000 then 0
                end as PotentialOrderGain,
                case when h.SubTotal>=1500 and h.SubTotal<2000 then 0.22-h.Freight
                when h.SubTotal<1500 then 0
                when h.SubTotal>=2000 then 0.22-h.Freight
                end as PotentialFreightLoss
                FROM Sales.SalesOrderHeader h
                )SumTotals ON a.AddressID = SumTotals.ShipToAddressID
    where i.StateProvinceName='California'
    order by h.SalesOrderID;
    

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多