Sql server 用于复制包含循环引用的Excel计算的SQL Server代码

Sql server 用于复制包含循环引用的Excel计算的SQL Server代码,sql-server,sql-server-2005,Sql Server,Sql Server 2005,有没有办法将带有循环引用的公式从Excel文件复制到SQL Server中?我的客户使用excel文件计算销售价格。销售价格字段为(成本/1-预计利润))=6.5224(1-.6)=16.3060。成本中的一个数字是佣金,它的定义是销售价格乘以佣金率 费用=6.5224 预计利润率=60% 佣金=16.3060(售价)*.10(佣金率)=1.6306(属于6.5224的一部分) 他们绕过了Excel中的循环引用问题,因为Excel允许他们选中启用迭代计算选项,并在100次之后停止迭代 使用SQL

有没有办法将带有循环引用的公式从Excel文件复制到SQL Server中?我的客户使用excel文件计算销售价格。销售价格字段为(成本/1-预计利润))=6.5224(1-.6)=16.3060。成本中的一个数字是佣金,它的定义是销售价格乘以佣金率

费用=6.5224 预计利润率=60% 佣金=16.3060(售价)*.10(佣金率)=1.6306(属于6.5224的一部分)

他们绕过了Excel中的循环引用问题,因为Excel允许他们选中启用迭代计算选项,并在100次之后停止迭代

使用SQLServer2005是否可以做到这一点

谢谢

不,这是不可能的

mysql> select 2+a as a;
ERROR 1054 (42S22): Unknown column 'a' in 'field list'
sql表达式只能引用已经存在的表达式。 你甚至不会写字

mysql> select 2 as a, 2+a as b;
ERROR 1054 (42S22): Unknown column 'a' in 'field list'

将数据库视为一个事务引擎,在一个步骤中将数据从一个状态转换为另一个状态(使用不仅对标量值而且对集合进行操作的运算符组合)。

这是一个业务问题,而不是IT问题,因此您需要的是业务解决方案,而不是IT解决方案。听起来你不是在为一个特别精明的客户工作。基本上,你将佣金反馈到成本中,并重新计算100次佣金。那么销售员是根据佣金来赚取佣金的?!?真的吗?:-)

我会试图说服他们分别计算成本和佣金。我曾在会计实践良好的专业组织工作过,但这些成本通常被分解为运营成本、非运营成本或原材料成本,这应能提高他们对业务的理解。若要稍后报告总成本,请添加佣金和原材料成本。没有循环和良好的会计报告

在我工作过的银行,这些成本通常被称为成本(无佣金或费用)、净成本(成本+佣金)和奇怪的净成本(成本+佣金+费用)。根据业务模式的不同,成本分解可能会变得非常有趣

这里有两个明智的选择,你可以建议他们计算售价

选项1:如果您要计算保证金以排除佣金

佣金前价格=成本+(成本*(1-预计利润))

售价=佣金前价格+(佣金前价格*佣金)

选项2:如果您的客户坚持计算保证金以包括佣金(听起来他们可能想这样做),那么

成本价=成本+(成本*佣金)

单位利润或单位贡献=成本价*(1-预计利润)

售价=成本价+单位利润

这在会计术语上是明智的,并且是用SQL或任何其他软件工具实现的一种冒险。这还意味着,当每种产品的预期利润率不同时,您的客户有一种分析其销售额的方法来强调单位成本和单位利润。随着业务的增长,这种情况总是会发生

不要盲目地接受来自电子表格的计算。仔细想想,不要害怕问你的客户他们想要实现什么。经常出现的情况是,在受到质疑之前,破碎的业务流程会一直延伸到it部门。不要害怕做好工作,这有时意味着当客户的要求毫无意义时,要挑战他们


祝你好运

虽然我同意@Sir Wobin的回答,但如果您确实想编写一些递归代码,您可以通过滥用以下命令来实现:

使用RecurseCalc作为(
选择CAST(1.5作为浮动)作为值,1作为Iter
联合所有
从RecurseCalc中选择2*值,1+Iter,其中Iter<100
),最终结果为(
按Iter desc从RecurseCalc顺序中选择top 1值
)
从最终结果选项中选择*(maxrecursion 100)
with RecurseCalc as (
    select CAST(1.5 as float) as Value,1 as Iter
    union all
    select 2 * Value,1+Iter from RecurseCalc where Iter < 100
), FinalResult as (
    select top 1 Value from RecurseCalc order by Iter desc
)
select * from FinalResult option (maxrecursion 100)