Sql server 在同一位置的记录上分发$value

Sql server 在同一位置的记录上分发$value,sql-server,tsql,math,Sql Server,Tsql,Math,我有一张带有位置、ID、费用类型和成本的表。 有三种特定的费用类型需要在其他费用类型上进行分配 示例数据 在示例数据中,为了简单起见,只显示了一个位置 三个类型值x,y,z是要分布在其他类型上的类型(a->e) 分发需要分为三个阶段,三种类型各一个,并有一个审计跟踪,显示有多少类型x进入了每种类型,然后是y和z。顺序是x->y->z 分布基于每种类型的分组和,因此在示例数据中,分组是 a - 31.3 b - 15 c - 68.4 d - 57.3 e - 55.3 x的值为-12.7分布公

我有一张带有位置、ID、费用类型和成本的表。 有三种特定的费用类型需要在其他费用类型上进行分配

示例数据

在示例数据中,为了简单起见,只显示了一个位置

三个类型值
x
y
z
是要分布在其他类型上的类型(
a->e

分发需要分为三个阶段,三种类型各一个,并有一个审计跟踪,显示有多少类型
x
进入了每种类型,然后是
y
z
。顺序是
x->y->z

分布基于每种类型的分组和,因此在示例数据中,分组是

a - 31.3
b - 15
c - 68.4
d - 57.3
e - 55.3
x
的值为
-12.7
分布公式为
aDiff=(a*(x/(a+b+c+d+e))

aDiff
然后均匀地分布在每个
a
类型上。在本例中,
aDiff
-1.74
,因此,由于有两个
a
值,ID 101将是10.5+(aDiff/2),导致审计值为
-0.874的
9.63

有人知道怎么做吗?我正在努力从哪里开始使用sql脚本来实现这一点

编辑:
用最新代码更新了SQL。我发现的问题是,当将此应用于完整数据集时,值是不正确的。原始数据的A-Z之和应等于新数据中的A-E之和,但事实并非如此。不确定此阶段发生了什么。

解决此问题的最简单方法是1)创建一个函数来执行内部计算,2)使用左自联接中的函数。您在问题中发布的一些值与SQL FIDLE中的值不同,所以我使用了FIDLE中的值

另外,由于9.63+-.874=8.756,而不是10.5,因此不清楚您应该如何计算审计值,因此我将该计算作为(aDiff/2)执行

我希望这有帮助

--Step1: Create a function that calculates the xDiff distribution formula, aDiff =  (a*(x / (a+b+c+d+e)))

IF OBJECT_ID('aDiff_fn','fn') IS NOT NULL
DROP FUNCTION aDiff_fn
GO

CREATE FUNCTION [dbo].[aDiff_fn] (@a decimal(10,6))
RETURNS decimal(10,6)
AS
BEGIN

RETURN

@a *
(
    (SELECT sum(cost)
    FROM expenses
    WHERE [type] = 'x')
/

    (SELECT sum(cost)
    FROM expenses
    WHERE [type] in ('a','b','c','d','e'))
)
END
GO

---Step2: Compare original values and the aggregates using a self JOIN

SELECT
    e.Location,
    e.ID, 
    e.[Type],
    e.Cost,
    g.CountOfType,
    g.TotalCostOfType,
    g.aDiff,
    e.Cost+(g.aDiff/g.CountOfType) AS yValue,
    (g.aDiff/g.CountOfType) AS AuditValue
FROM
    expenses AS e
LEFT JOIN
    (
    SELECT
        [type],
        count([type]) AS CountOfType,
        sum(cost) AS TotalCostOfType,
        dbo.aDiff_fn(sum(cost)) AS aDiff
    FROM
        expenses
    GROUP BY
        [type]
    ) AS g
    ON e.[type] = g.[type]

-0.874审核显示了应用的变更。旧值为10.5,新值为9.63,因X引起的变化为-0.874。一旦添加了其他值,您将能够看到X导致的变化为-0.874,Y导致的变化为-4,Z导致的变化为+1。我要玩一下你的密码。您可以检查我当前使用的代码的SQLFIDLE。