我想在这里你的建议,使用一个标量值函数的mssm计算平均数据集来2个不同的表。
每个表由12列表示值,此外,每个表还有3列不同的数据,在计算平均值时,这3列应在两个表上匹配(产品标识、销售代表标识和日期(年))
我试过这样的标量值函数:
create FUNCTION [dbo].[Sales_BU_ScenarioB_PriceAv](@Product_ID nvarchar(255), @SalesRep_ID float, @Year float)
RETURNS decimal(18,0)
AS
BEGIN
DECLARE @Result decimal(18,0)
set @Result = (SELECT
case when
(
isnull(q.P01,0)
+ isnull(q.P02,0)
+ isnull(q.P03,0)
...
+ isnull(q.P12,0)
)
=0
then
0
else
(isnull(p.P01,0)*isnull(q.P01,0)
+ isnull(p.P02,0)*isnull(q.P02,0)
+ isnull(p.P03,0)*isnull(q.P03,0)
...
+ isnull(p.P12,0)*isnull(q.P12,0)
)
/
(
isnull(q.P01,0)
+ isnull(q.P02,0)
+ isnull(q.P03,0)
...
+ isnull(q.P12,0)
)
end
from DataEntrySalesQty$ q, DataEntrySalesPrice$ p
where @Year = p.Year and
@Product_ID = p.Product_ID and
@SalesRep_ID = p.SalesRep_ID)
RETURN @Result
END
这应该计算:sum((p.p01q.p01)…(p.p12q.p12))并除以:sum(q.p01,q.p02….q.p12),以得到这些列中所有相关行的平均价格。
当我运行这个函数时,它看起来很正常,但是当我尝试测试结果时
select
Product_ID, SalesRep_ID, [Year], [dbo].[Sales_BU_ScenarioB_PriceAv](Product_ID, SalesRep_ID, [Year])
from DataEntrySalesQty$
我得到下一个错误:msg512,级别16,状态1,行1子查询返回的值超过1。当子查询后跟=,!=,<,<=,>,>=或者当子查询用作表达式时。
你能帮我理解我做错了什么吗?
谢谢你的帮助
1条答案
按热度按时间xytpbqjk1#
我建议你
cross apply
要取消将列拆分为行,然后进行聚合,请执行以下操作: