Tsql T-SQL中相互服务的单位之间的互惠成本分配(典型的管理会计问题)

Tsql T-SQL中相互服务的单位之间的互惠成本分配(典型的管理会计问题),tsql,recursive-query,cost-management,Tsql,Recursive Query,Cost Management,我正在拼命寻找一种有效的方法——如果有的话——来解决T-SQL中的某种递归任务(我可以通过迭代解决方案在excel和纸面上成功地对其建模——就像许多CMA在一个小例子中所做的那样,在迭代中相互服务的成对支持单元之间重新分配成本份额,并将平衡单元的未分配成本剩余最小化到合理的小数目,以停止迭代/递归) 现在,我正试图找到一个良好的可扩展解决方案(或至少是可行的方法),如何在T-SQL中实现管理会计领域的这一典型计算任务:当一些内部支持单位相互服务时(并产生定期成本,如工资等)为了最终生产,假设作为

我正在拼命寻找一种有效的方法——如果有的话——来解决T-SQL中的某种递归任务(我可以通过迭代解决方案在excel和纸面上成功地对其建模——就像许多CMA在一个小例子中所做的那样,在迭代中相互服务的成对支持单元之间重新分配成本份额,并将平衡单元的未分配成本剩余最小化到合理的小数目,以停止迭代/递归)

现在,我正试图找到一个良好的可扩展解决方案(或至少是可行的方法),如何在T-SQL中实现管理会计领域的这一典型计算任务:当一些内部支持单位相互服务时(并产生定期成本,如工资等)为了最终生产,假设作为一家公司一起生产2或3个最终产品,因此,在成本计算工作结束时,需要将其各自的内部产生的支持间接费用份额合理地分配给这些产品的成本(根据一些实际基础分布,假设-每个产品花费的工时)

如果没有互惠服务,这将非常简单:一个支持单位在此期间向其他支持单位提供一些服务(并且需要将各自的成本与此服务数量流一起分配)第二个和第三个支持单位对其他支持单位做同样的事情,在他们的所有成本正确地计入生产成本并在他们共同服务的各自产品之间分摊之前(不是对所有支持单位都一样,我在这里使用的是基于活动的成本计算方法)…在实际案例中,可能不止2-3个单元可以在excel或纸上手动求解。因此,它确实需要一些动态参数算法(X数量的支持单元在服务期间为X-1对等方和Y产品提供服务,基于某些数量度量/%平方矩阵分配表)最终将其周期性成本分摊到每种产品的一个单位。最好是以某种方式在SQL中本地进行,而不使用外部.NET或其他程序集引用

一些数字示例:

  • 3个支援单位A、B、C在该期间分别产生了100美元、200美元、300美元的费用,每个单位工作50人时
  • A-装置维修B-装置10小时,C-装置5小时,B-装置维修A-装置5小时,C-装置维修A-装置3小时,B-装置10小时
  • 支持单元的剩余工作时间(A单元35小时:P1为30%,P2为70%;B单元45小时:P1为35%,P2为65%;C单元37小时,P2为100%)用于服务两种产品(P1和P2)的输出;这部分直接时间/精力很容易分配到产品上——但由于相互提供互惠服务,需要将支持单位成本的一部分转移到与其直接时间到产品分配不相等的相应产品成本池中(需要调整步骤2效应的混合系数)
  • 我可以通过迭代算法和使用VBA数组在excel中解决此问题: (a) 每个支持单元的周期成本向量(最终重新分配到产品并保留0), (b) 支持单位之间自助服务系数的2dim阵列/矩阵(基于工时-一对一), (c) 支持单位为每个产品提供的直接hrs服务的2dim阵列/矩阵, (d) 最小容许误差$1(单位中未分配成本的剩余部分,用于停止迭代) 对于2或3个元素(虽然仍然可以在纸上手动验证),这是一种可行的方法,但一旦我有10-20多个支持单元和矩阵中的许多产品,就不可能手动验证正确的解决方案;出于其他原因,我想从excel和VBA切换到MS SQL server和t-SQL

    由于这个业务案例本身并不新鲜,我希望更有经验的同事能够提出如何最好地解决这个问题的建议-我相信以前一定有解决这个问题的方法(不是在纯编程环境/外部代码中)。 我正在考虑将CTE(递归)、表变量和聚合窗口函数结合起来,但对于如何最好地/准确地将所有拼图元素组合在一起,使其真正可扩展到我潜在增长的单位/产品矩阵维度,我感到犹豫/挣扎。
    就我目前的水平而言,这有点令人兴奋,因此我非常感谢您的建议。

    示例数据(最好是DDL和DML语句,如果不是格式良好的表格
    文本
    ),示例结果和您的尝试将帮助我们帮助您。您是否考虑过使用CLR函数()用C#这样的语言来实现复杂的需求会更容易。@Kevin:CLR函数和其他外部程序集-如果存在任何可能的SQL集成解决方案,这就是我试图避免的suffice@SergeyT-为什么不使用最好的工具来完成这项工作呢?您可以很容易地从T-SQL调用CLR函数,我发现代码很复杂更容易维护外部SQL。CLR函数也应该快几倍。@凯文谢谢,如果没有人提出一些自然的SQL解决方案(用CTE递归、表变量、Windows聚合等),我将考虑编码它。(尽管在我相信关系数学的日益强大以及MSSQL在其最新版本中的新特性后,我希望避免这种情况)示例数据(最好是DDL和DML语句,如果不是格式良好的表格
    文本
    ),示例结果和您的尝试将帮助我们。您是否考虑过使用CLR函数()用C#这样的语言来实现复杂的需求会更容易。@Kevin:CLR函数和其他外部程序集-如果存在任何可能的SQL集成解决方案,这就是我试图避免的suffice@SergeyT-为什么不使用最好的工具来完成这项工作呢?您可以很容易地从T-SQL调用CLR函数,我发现代码很复杂更易于在SQL外部维护。CLR函数也应多次使用