首页 > 解决方案 > 在函数调用后合并返回错误值,然后是乘法

问题描述

我有一个提供信息的报告,并且我得到的信息不一致,这基于 SQL 视图或可能嵌套在视图中的 SQL 函数的一些问题。我已经尝试找到一种调试 SQL 视图的方法,但是,看起来 SSMS 只能调试存储过程,所以我不太确定如何单步执行并查看发生了什么。这真的让我很难过,我不禁想知道这不是一个四舍五入的问题。GetItemAverageCostRETURNS DECIMAL(12,2)并且 satli.QuantityIssuedAtStockUOM 中的 DataType 是 System.Int64 / bigint (旁注:我对为什么 LINQPad 显示该列的 2 种数据类型感到困惑。在左侧的树中,展开 satli 表并将鼠标悬停在 QuantityIssuedAtStockUOM 上之后,气球BigInt NOT NULL 弹出,但是当我 Take(100) 并将鼠标悬停在结果集中的列上时,它显示 System.Int64)。Anyroad,这里是 COALESCE 函数。

COALESCE((dbo.GetItemAverageCost(ItemModel.IDItemModel)*sitli.QuantityIssuedAtStockUOM) / ISNULL(NULLIF(ItemModel.UOMFactor, 0),1),0) -- 259.73 --ROUND(COALESCE((dbo.GetItemAverageCost(ItemModel.IDItemModel)*sitli.QuantityIssuedAtStockUOM) / ISNULL(NULLIF(ItemModel.UOMFactor, 0),1),0),2) -- 259.73 --COALESCE(ROUND((dbo.GetItemAverageCost(ItemModel.IDItemModel)*sitli.QuantityIssuedAtStockUOM) / ISNULL(NULLIF(ItemModel.UOMFactor,2), 0),1),0) -- 259.70 --COALESCE((ROUND(dbo.GetItemAverageCost(ItemModel.IDItemModel),2)*sitli.QuantityIssuedAtStockUOM) / ISNULL(NULLIF(ItemModel.UOMFactor, 0),1),0) -- 259.73

原始/错误合并:

COALESCE(dbo.GetItemAverageCost(ItemModel.IDItemModel)*sitli.QuantityIssuedAtStockUOM,0)

我不确定还包括什么,但我还没有在网上找到很多可以深入了解这种情况的资源。非常感谢您抽出宝贵时间。

编辑:GetItemAverageCost:

    ALTER FUNCTION GetItemAverageCost
        (
            @IDItemModel varchar(8000)
        )

        RETURNS DECIMAL(16,4)
        --RETURNS DECIMAL(12,2)
        AS
        BEGIN
        RETURN
        (
        SELECT 
            COALESCE(AVG(poli.UnitPrice),0) as AvgCost
--          COALESCE(ROUND(AVG(poli.UnitPrice),0),2) as AvgCost 260.00
        FROM ItemModel im
        LEFT JOIN VendorItem vi
            ON im.IDItemModel = vi.IDItemModel
        JOIN POLineItem poli
            ON vi.IDVendorItem = poli.IDVendorItem

        WHERE
            im.IDItemModel = @IDItemModel

        GROUP BY
            im.IDItemModel,
            im.ItemNumber
        )
        END

标签: sqllinqpadcoalesce

解决方案


好的,非常感谢一路上帮助过的所有人。有几个问题阻止我得到正确的答案。一方面,我大部分时间都在使用不正确的表达方式。其次,在我弄清楚要使用哪个表达式之后,问题就是将 ROUND 函数放在正确的位置。

所以,我应该用来计算平均成本的表达式是:

COALESCE(dbo.GetItemAverageCost(Item.IDItemModel) / ISNULL(NULLIF(UOMFactor, 0),1),0)

当我将它移到 WorkOrderItemInstructionPartCosts 视图中时,我的报告产生了 10.82 美元。然后我添加*sitli.QuantityIssuedAtStockUOM到该行并获得 259.73 美元。然后我将 ROUND 函数应用于 COALESCE 函数,瞧!正在产生正确的价值(259.68 美元)。

最后一行如下所示:

ROUND(COALESCE(dbo.GetItemAverageCost(ItemModel.IDItemModel) / ISNULL(NULLIF(UOMFactor, 0),1),0),2)*sitli.QuantityIssuedAtStockUOM

再次感谢所有帮助我解决此问题的人,并为没有准确的信息一开始感到抱歉。最好的,乔纳森


推荐阅读