Sql server 在同一位置的记录上分发$value
我有一张带有位置、ID、费用类型和成本的表。 有三种特定的费用类型需要在其他费用类型上进行分配 示例数据 在示例数据中,为了简单起见,只显示了一个位置 三个类型值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分布公
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。