2016-08-04 53 views
1
 @date1 Date = '2011-06-01' 
    ,@date2 Date ='2016-06-30' 
    ,@StoreNo Nvarchar(Max)=' ' 
As 
Begin 
Select 
     STD.StoreNo As StoreNo 
     ,CheckDate As CheckDate 
     ,ProductBarCode as ProductBarCode 
    , SUM(case 
    when Lead(STD.StockTakingQty) over (order by STD.StockTakingQty) is null 
     and [CheckDate] <> EOMONTH([CheckDate]) 
     then STD.[StockTakingQty] 
    else STD.[StockTakingQty] - lead(STD.[StockTakingQty]) over (order by STD.StockTakingQty) 
    end)AS ProducQty 
    Into ##temp 
    From StockTakingDetail STD 
Inner Join 
(Select StoreNo,CheckNo,CheckDate 
       From StockTakingMain SM)StocktakingMain 
    On STD.CheckNo =StockTakingMain.CheckNo 

    Where 
    CheckDate Between @date1 AND @date2 

    Group by 
     STD.StoreNo,ProductBarCode,CheckDate 

If EXISTS (Select StoreNo from ##temp) 

Begin 

Declare @sql Nvarchar(max) 
SET @sql = N'Select * from ##temp where 1=1 ' [email protected]+ 'Order By StoreNo,ProductBarcode' 
EXECUTE sp_executesql @sql 
END 

Else 

BEGIN 
SELECT 
     ' ' as StoreNo 
     ,'' as CheckDate 
     ,'' as ProductBarCode 
     ,0 as ProductQty 

End 

DRop Table ##temp 

End 

我嘗試了每日清單和每月一次,他們爲您進行盤點,但我必須表明日常庫存不能離開Null值有。窗函數不能在另一個窗口函數的上下文或使用聚合

+0

我刪除了「mysqli」標籤並將其替換爲SQL Server,因爲語法顯然是SQL Server。另外,你應該嘗試簡化你的查詢。正如所寫,很難遵循並確定錯誤的可能性。 –

回答

0

您正在嘗試在SUM內部使用LEAD - 這就是爲什麼您會收到錯誤。而不是LEAD使用OUTER APPLY獲得您需要的下一個值。

Select STD.StoreNo As StoreNo, 
     CheckDate As CheckDate, 
     ProductBarCode as ProductBarCode, 
     SUM(case 
       when s.StockTakingQty is null and [CheckDate] <> EOMONTH([CheckDate]) 
       then STD.[StockTakingQty] 
       else STD.[StockTakingQty] - s.StockTakingQty 
      end) AS ProducQty 
Into ##temp 
From StockTakingDetail STD 
Inner Join (
    Select StoreNo, 
      CheckNo, 
      CheckDate 
    From StockTakingMain SM 
    )StocktakingMain 
    On STD.CheckNo =StockTakingMain.CheckNo 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM StockTakingDetail 
    WHERE SomeIDfield = STD.SomeIDfield 
    ORDER BY StockTakingQty 
    ) s 
Where CheckDate Between @date1 AND @date2 
Group by STD.StoreNo,ProductBarCode,CheckDate