在mssm中使用标量值函数处理来自两个表的数据

6pp0gazn  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(282)

我想在这里你的建议,使用一个标量值函数的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。当子查询后跟=,!=,<,<=,>,>=或者当子查询用作表达式时。
你能帮我理解我做错了什么吗?
谢谢你的帮助

xytpbqjk

xytpbqjk1#

我建议你 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

相关问题