2015-08-26 25 views
0

我有一个包含位置,ID,费用类型和成本的表格。 有三种特定的费用类型需要分配给其他费用类型。

实施例数据SQL Fiddle

在该例子中数据,为简单起见,只有一个位置。

三种类型值x,y,z是要分配到其他类型(a->e)的类型。

分配需要在三个阶段,每个三种类型,并有一个审计线索,显示多少x类型的去各类型,然后yz。订单是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),从而导致与9.63-0.874审计值

任何人都知道如何去吗?我正努力从哪里开始使用sql脚本来做到这一点。

编辑: 更新SQL小提琴与最新的代码。我发现的问题是,将其应用于完整数据集时,值不正确。原始数据的A-Z总和应该等于新数据中A-E的总和,但不是。不知道现阶段发生了什么。

回答

0

解决这个问题的最简单方法是通过1)创建一个函数来执行内部计算,2)使用左自连接中的函数。您在问题中发布的一些值与SQL小提琴中的值不同,因此我使用小提琴中的值。

此外,目前还不清楚你应该如何计算你的审计价值,因为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

-0.874审计显示应用的更改。旧值10.5,新值9.63,由于X的变化为-0.874。一旦添加了其他值,您将能够看到X导致-0.874的变化,Y导致-4的变化,并且Z导致+1的变化。我会玩你的代码。您可以检查我正在使用的代码的SQL小提琴。 – Matt

相关问题