SQL избегает Multipart Identifier в подзапросе - PullRequest
0 голосов
/ 17 июня 2019

Использование SQLExpress 2017

У меня есть несколько продуктов, распределенных по складам, и я хотел бы узнать, сколько товаров нужно будет складировать для удовлетворения продаж за определенный период.

Need pr. warehouse = Stock - CustomerOrders + SupplierOrders - SumOfSalesInPeriod

Теперь я хотел бы подвести итог для каждого продукта, но меня не интересуют склады, где потребность уже удовлетворена, поэтому я хочу только отрицательные значения, но у меня есть некоторые проблемы с тем, чтобы заставить его работать, поскольку меня встречают Ошибки Multipart Identifier. Использование отличного ключевого слова также заставляет меня думать, что я делаю слишком много вычислений, и должен быть лучший способ сделать это.

declare @fromDate date = '1900-01-01 12:00:00';
declare @toDate date = '3000-01-01 12:00:00';

select *,
    balance =  
        (select 
            turn = sum(TurnOver)
        from (
        select 
            WarehouseStocks.Id,
            TurnOver = WarehouseStocks.Qty 
                        - WarehouseStocks.OrderedByCustomersQty 
                        + WarehouseStocks.OrderedFromSuppliersQty 
                        - isnull((select Sum(StockEntries.Qty) 
                                    from StockEntries 
                                    where 
                                        StockEntries.Type = 1 
                                        and StockEntries.ProductId = WarehouseStocks.Id 
                                        and WarehouseStocks.WarehouseId = StockEntries.WarehouseId 
                                        and StockEntries.Date >= @fromDate 
                                        and StockEntries.Date <= @toDate), 0) 
        from WarehouseStocks) Product where TurnOver < 0
        group by Product.Id) tp where Products.Id = tp.Id)
from Products

1 Ответ

1 голос
/ 17 июня 2019

Я бы переписал это, используя вместо этого CTE, чтобы разбить его и сделать запрос более читабельным. Примерно так:


declare @fromDate date = '1900-01-01 12:00:00';
declare @toDate date = '3000-01-01 12:00:00';

;with SE 
as
(
    select Sum(StockEntries.Qty) as SumStockEnties , StockEntries.ProductId, StockEntries.WarehouseId 
    from StockEntries 
    where 
        StockEntries.Type = 1 
        and StockEntries.Date >= @fromDate 
        and StockEntries.Date <= @toDate
    group by StockEntries.ProductId, StockEntries.WarehouseId 
),
TP
as
(
    Select WS.Id, WS.Qty - WS.OrderedByCustomersQty + WS.OrderedFromSuppliersQty - isnulle(SE.SumStockEnties, 0) as TurnOver
    from WarehouseStocks as WS
         left join SE
         on  SE.ProductId = WS.Id
          and SE.WarehouseId = WS.WarehouseId 
)
Select *
from TP 
    inner join Products as PR
    on PR.id = TP.id
Where PR.TurnOver < 0
...