2014-01-24 62 views
0

我有兩個表如下:SQL選擇行直到條件

第一個表顯示所有訂單:

table PURCHASE_ORDER: 
ID UNIT_# PRICE ITEM_KEY 
1  2   3  1 
2  3   2.5  1 
3  1   3  1 

第二個表顯示在清單的單位可用數量:

table INVENTORY: 
ID ITEM_KEY UNIT_AVAILABLE 
1  1   5 
2  2   7 

現在的問題是如何計算庫存中物料的平均成本。例如對於項目1:

項目1的平均成本=((1 * 3)+(3 * 2.5)+(1 * 3))/ 5
/*庫存中項目的總數是5(1 + 3 + 1 = 5)*/

是否有任何方法可以在純Microsoft SQL中執行此操作?

+0

什麼是Unit_#?這是你以這個價格購買的單位數量嗎? – 2014-01-24 00:06:54

+0

是的,這正是它是 – kousha

+0

是的,它可以做到。你介意在這裏解釋每個號碼的列名嗎? ((1 * 3)+(3 * 2.5)+(1 * 3))/ 5 ...謝謝...像第一個1是Item_Key或其他 –

回答

1

您需要一個累計和。讓我假設您正在使用SQL Server 2012,因爲它簡化了代碼。

select po.item_key, 
     (sum(case when po.cumunits <= i.unit_available then po.[unit#]*po.price 
       when po.cumunits > i.unit_available and 
         po.cumunits - [unit#] < i.unit_available 
       then (i.unit_available - (po.cumunits - [unit#]))*po.price 
       else 0 
      end)/
     sum(case when po.cumunits <= i.unit_available then po.[unit#] 
       when po.cumunits > i.unit_available and 
         po.cumunits - [unit#] < i.unit_available 
       then (i.unit_available - (po.cumunits - [unit#])) 
       else 0 
      end) 
    ) as avgprice 
from (select po.*, sum([unit#]) over (partition by item_key order by id) as cumunits 
     from purchase_order po 
    ) po join 
    inventory i 
    on po.item_key = i.item_key 
group po.item_key; 

在早期版本的SQL Server中,您需要使用相關子查詢作爲累計和。

+0

這看起來是我想要的。我會嘗試並讓你知道。 – kousha

+0

這一個沒有工作,我想我會用一些其他非數據導向的語言來做到這一點 – kousha

0

基於表如何設置

select po.* 
    , i.* 
    , AvgPrice = sum(po.[UNIT_#] * po.Price) over (partition by po.item_key) 
       /
        i.unit_available 
    from PURCHASE_ORDER po 
     inner join INVENTORY i 
     on (po.ITEM_KEY = i.ITEM_KEY); 

應該做的伎倆