在 MSSM 中使用标量值函数和来自 2 个表的数据
Posted
技术标签:
【中文标题】在 MSSM 中使用标量值函数和来自 2 个表的数据【英文标题】:Using scalar valued function in MSSM with data from 2 tables 【发布时间】:2020-06-23 07:54:30 【问题描述】:我想在这里就在 MSSM 上使用标量值函数计算来自 2 个不同表的数据集的平均值提出您的建议。
每个表包含 12 列表示值,此外每个表还有 3 列来区分数据,并且在计算平均值时,这 3 列应在两个表上匹配(Product_ID、SalesRep_ID 和日期(年份))
我试过这样的标量值函数:
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.P01 * q.P01)....(p.P12 * q.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$
我得到下一个错误: 消息 512,第 16 级,状态 1,第 1 行 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
你能帮我理解我做错了什么吗?
感谢所有的帮助
【问题讨论】:
进化!没有人应该通过 where 子句使用旧式连接。你注意到加入错误了吗?使用 join syntx 会很明显。 @SM或者在这种情况下如何使用连接语法? 【参考方案1】:我会推荐 cross apply
将列转为行,然后聚合:
select
q.product_id,
q.year,
q.salesrep_id,
sum(x.p * x.q) / sum(x.q) avg_price
from DataEntrySalesPrice$ AS p
inner join DataEntrySalesQty$ AS q
on q.product_id = p.product_id
and q.year = p.year
and q.salesrep_id = p.salesrep_id
cross apply (values
(p.p01, q.q01),
(p.p02, q.q02),
...,
(p.p12, q.q12)
) as x(p, q)
group by q.product_id, q.year, q.salesrep_id
【讨论】:
感谢@GMB 的快速回放!我想在标量值函数上使用此功能,因为它是我会使用的重复计算,这可能吗?以上是关于在 MSSM 中使用标量值函数和来自 2 个表的数据的主要内容,如果未能解决你的问题,请参考以下文章
从 C# 调用时,来自 SQL Server 的标量值函数不返回值
使用 Join 和 Union 组合来自 2 个表的结果 [关闭]