сумма 2 кейс-функции при объединении 3 таблиц sql sql сервер - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь суммировать две функции CASE (2 столбца PotentialOrderGain и PotentialFreightLoss из операторов case), которые я только что создал в своем запросе. Мне нужно создать новый столбец как NetGainLoss путем суммирования этих двух функций case вместе. Я знаю, что могу использовать метод cte, чтобы сделать это. Но в то же время мне нужно объединить три таблицы вместе. 3 таблицы: Person.Address и Sales.SalesOrderHeader и Sales.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;

Ответы [ 2 ]

1 голос
/ 29 января 2020
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;
1 голос
/ 29 января 2020

Это, вероятно, медленный / неэффективный метод из-за большого объема данных, введенных в четвертое объединение, но он должен дать вам отправную точку:

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;
...