sql - SQL 加权平均值

标签 sql sql-server tsql

我正在尝试创建一个 TSQL 函数来计算库存计算的加权平均成本。所以给出如下表结构

ProductId | DatePurchased | Qty | Cost
--------- | ------------- | --- | ----
1         | Jan 1         | 10  | 1.50
1         | Jan 10        | 5   | 2.00
1         | Jan 20        | 7   | 2.50

现在如果有人在 1 月 21 日购买了 15 个,则加权成本将为

((7 * 2.5) + (5 * 2.0) + (3 * 1.5))/15 = 2.13

基本上,这是 1 月 20 日的 7 个、1 月 10 日的 5 个和 1 月 1 日的 3 个的平均成本。

我确信这可以通过某种递归 CTE 来完成,但由比我更聪明的人完成。

最佳答案

权重平均值很简单:

select sum(qty * cost) / sum(qty)
from t;

您正在寻找其他东西。也许是“分配的”平均值:

select sum(case when cume_qty - qty < 15 then qty * cost
                else (cume_qty - 15) * cost
           end) as allocated_average
from (select t.*,
             sum(qty) over (partition by productid order by date desc) as cume_qty
      from t
     ) t
where cume_qty - qty < 15 and
      cume_qty >= 15;

关于sql - SQL 加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43432630/

相关文章:

SQL Server 日期列不大于另一个日期列

json - 在存储过程中多次访问 OPENJSON 解析的 JSON?

返回唯一关联的 MySQL 语句

mysql - 多个大型 MySQL SELECT 查询——最好并行运行还是在队列中运行?

sql-server - nvarchar (Unicode) 列的 COLLATIONS 有何意义?

c# - SELECT 和 UPDATE 表,因此没有线程重叠

sql - MS SQL Server 交叉表约束

database - MERGE 也可以DELETE 吗?示例仅显示 INSERT/UPDATE

sql - 具有分组依据的oracle滞后函数

sql - 在 sql 组合值中分组