簡體   English   中英

具有聚合功能的自連接或更好的方法

[英]Self join with aggregate function or some better way

我正在使用SQL-Server並且有我的采購訂單(庫存)表 但是當我試圖獲取具有其最新成本價格最新售價的 所有可用庫存時,卻陷入了查詢。

我進行了查詢,查詢成功運行,但是我需要一些更好的優化方法來執行此操作,因為當表具有n條記錄時,它會變慢。

查詢樣本:

SELECT 
    po.ProductID, sum(po.AvailableQty) as AvailableQty,
    (select top 1 po2.CostPrice from Sales_PurchaseOrders po2 where po2.PurchasedAt=max(po.PurchasedAt)) as CostPrice,
    (select top 1 po2.SellingPrice from Sales_PurchaseOrders po2 where po2.PurchasedAt=max(po.PurchasedAt)) as SellingPrice
FROM 
    Sales_PurchaseOrders po
INNER JOIN Sales_Products p on p.ProductID=po.ProductID
GROUP BY po.ProductID

表格數據:

PurchaseOrderID ProductID   CostPrice                               SellingPrice                            AvailableQty                            PurchasedAt
--------------- ----------- --------------------------------------- --------------------------------------- --------------------------------------- -----------------------
1               1           90.000000                               100.000000                              2.000000                                2016-07-28 00:00:00.000
2               1           33.580000                               50.000000                               0.000000                                2016-06-28 00:00:00.000
3               2           200.000000                              240.000000                              15.000000                               2016-07-30 00:00:00.000
4               1           50.000000                               60.000000                               0.000000                                2016-08-02 00:00:00.000
5               1           50.000000                               60.000000                               1.000000                                2016-08-03 00:00:00.000
6               1           100.000000                              110.000000                              6.000000                                2016-08-04 00:00:00.000
7               1           25.000000                               30.000000                               3.000000                                2016-08-03 00:00:00.000
8               1           20.000000                               30.000000                               0.000000                                2016-07-30 00:00:00.000
1007            1           100.000000                              200.000000                              2.000000                                2016-09-24 00:00:00.000

查詢結果:

ProductID   AvailableQty                            CostPrice                               SellingPrice
----------- --------------------------------------- --------------------------------------- ---------------------------------------
1           14.000000                               100.000000                              200.000000
2           15.000000                               200.000000                              240.000000

可以通過某種聚合函數或其他更好的優化方法來實現。

謝謝,

我認為這可以滿足您的需求:

SELECT po.ProductID, sum(po.AvailableQty) as AvailableQty,
       MAX(last_CostPrice), MAX(last_SellingPrice)
FROM (SELECT po.*, 
             FIRST_VALUE(CostPrice) OVER (PARTITION BY ProductId ORDER BY PurchasedAt DESC) as last_CostPrice,
             FIRST_VALUE(SellingPrice) OVER (PARTITION BY ProductId ORDER BY PurchasedAt DESC) as last_SellingPrice
      FROM Sales_PurchaseOrders po
     ) po
GROUP BY po.ProductID;

筆記:

  • 該表Sales_Products似乎完全不需要查詢。
  • 你可能想最近的產品成本和銷售價格,並不適用於所有產品。
  • 您可以在子查詢中使用FIRST_VALUE()來獲取此信息。

親愛的Mehmood嘗試一下。

;with wt_table 
as
(
select ROW_NUMBER() over(partition by po.ProductID order by PurchasedAt desc) as Num,
AvailableQty=sum(po.AvailableQty) over(partition by po.ProductID),
po.ProductID,
po.CostPrice,
po.SellingPrice,
po.PurchasedAt
From    #Sales_PurchaseOrders po)
select * from wt_table  where Num=1

嘗試這個:

with Sales_PurchaseOrders(PurchaseOrderID,ProductID,CostPrice,SellingPrice,AvailableQty,PurchasedAt)AS(
select 1,1,90.000000,100.000000,2.000000,'2016-07-28 00:00:00.000' union all
select 2,1,33.580000,50.000000,0.000000,'2016-06-28 00:00:00.000' union all
select 3,2,200.000000,240.000000,15.000000,'2016-07-30 00:00:00.000' union all
select 4,1,50.000000,60.000000,0.000000,'2016-08-02 00:00:00.000' union all
select 5,1,50.000000,60.000000,1.000000,'2016-08-03 00:00:00.000' union all
select 6,1,100.000000,110.000000,6.000000,'2016-08-04 00:00:00.000' union all
select 7,1,25.000000,30.000000,3.000000,'2016-08-03 00:00:00.000' union all
select 8,1,20.000000,30.000000,0.000000,'2016-07-30 00:00:00.000' union all
select 1007,1,100.000000,200.000000,2.000000,'2016-09-24 00:00:00.000'
)
select * from (
    SELECT 
po.ProductID, sum(po.AvailableQty)over(partition by po.ProductID) as AvailableQty,CostPrice,SellingPrice,
row_number()over(partition by po.ProductID order by po.PurchasedAt desc) as seq
    FROM  Sales_PurchaseOrders  po

) as t where t.seq=1
ProductID   AvailableQty    CostPrice   SellingPrice    seq
1   1   14,000000   100,000000  200,000000  1
2   2   15,000000   200,000000  240,000000  1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM