【发布时间】:2018-10-03 20:02:09
【问题描述】:
我有一份提供信息的报告,但我得到的信息不一致,这是因为 SQL 视图或嵌套在视图中的 SQL 函数似乎存在问题。我已经尝试找到一种调试 SQL 视图的方法,但是,看起来 SSMS 只能调试存储过程,所以我不太确定如何单步执行并查看发生了什么。这真的让我很难过,我不禁想知道这不是一个四舍五入的问题。
GetItemAverageCost RETURNS 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
【问题讨论】:
-
你能提供一些错误的例子吗?
-
@NetMage 感谢您的回复。运行给定报告时,不会引发任何错误。但是计算是关闭的。例如,零件编号 12 显示以 259.73 美元的成本发行了 24 件。但是,每个零件的成本为 10.82 美元,因此计算结果应为 259.68 美元。我不确定 5 美分的差价是从哪里来的。 259.73 美元是上述 COALESCE 函数的结果。希望这是有道理的。
-
此外,还有其他部分在计算中显示没有错误。仅发布了 1 的部分似乎根本没有任何错误。问题似乎通常发生在发行多于一份时。但是,某些已发行超过 1 个的零件(例如 2、4、12 等)的成本计算正确。
-
10.82 美元从何而来?
GetItemAverageCost第 12 部分返回什么? -
@NetMage $10.82 是 GetItemAverageCost 的结果。 GetItemAverageCost 理论上返回 10.82 美元。