SQL选择一行直到条件

时间:2014-01-24 00:01:52

标签: sql sql-server

我有两张表如下:

第一张表显示了所有订单:

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中有没有办法做到这一点?

2 个答案:

答案 0 :(得分: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中,您需要使用相关子查询来计算累积总和。

答案 1 :(得分: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);

应该做的伎俩