在 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 个表的结果 [关闭]

来自 2 个表的数据未显示在同一页面上

在“存在”函数中具有 cte 和前 1 的标量值函数

SQL Server:根据来自其他 2 个表的子查询从表中选择

Java - 合并来自不同数据源中的 2 个表的数据