sql - 在函数调用后合并返回错误值,然后是乘法
问题描述
我有一个提供信息的报告,并且我得到的信息不一致,这基于 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
解决方案
好的,非常感谢一路上帮助过的所有人。有几个问题阻止我得到正确的答案。一方面,我大部分时间都在使用不正确的表达方式。其次,在我弄清楚要使用哪个表达式之后,问题就是将 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
再次感谢所有帮助我解决此问题的人,并为没有准确的信息一开始感到抱歉。最好的,乔纳森
推荐阅读
- pgadmin - 数据不会导入 PG Admin
- python - 从(解析)Sympy结果中提取值的可靠方法
- java - 生成 Zip 文件 - 从 Url 下载 PDF 并生成 Zip 以在浏览器中下载 - 损坏的 PDF
- javascript - 访问音频文件的频率数据时,有什么方法可以不冻结 UI
- javascript - Prettier 配置了 Eslint,即使 `singleQuotes` 设置为 true,也会在引号中给出错误
- reactjs - KeyboardAvoidingView 使用多个输入
- pyspark - Group_by_key 在 Pyspark 中按顺序排列
- python - 无法从本地磁盘加载 BERT
- c - 无法将 'double' 转换为 'const char*'
- reactjs - react redux 如何通过函数传递初始状态?