我的查询没有得到正确的值
My query doesn't get the right value
我的查询没有给出正确的输出。
我也尝试过其他方法,例如 CTE,但没有任何帮助。
我正在尝试编写 View 来显示可用产品的数量,但由于某些数据在 StockCloseInventory 中不可用 table 它显示我 0,即使某些产品的记录可用。
这是我的查询:
SELECT TOP (100) PERCENT
SOI.InStockPrdID
, SOI.ProdName
, SOI.TradeDrugId
, ISNULL(SOI.Quantity, 0) AS INQTY
, ISNULL(SCI.QuantitySold, 0) AS OUTQTY
, ISNULL(SOI.Quantity, 0) - ISNULL(SCI.QuantitySold, 0) AS AQTY
, SOI.UnitPrice
FROM dbo.StockInventory AS SOI
LEFT OUTER JOIN dbo.StockCloseInventory AS SCI
ON SOI.InStockPrdID = SCI.InStockPrdID
AND SOI.SoldOut <> 1
LEFT OUTER JOIN dbo.vwTradeDrug AS VTD
ON SOI.TradeDrugId = VTD.TradeDrugId
ORDER BY SOI.ProdName
这是我的视图的输出:
这是我的 Tables
Table:库存
Table:库存关闭库存
vwTradeDrug 视图:
CREATE VIEW [dbo].[vwTradeDrug]
AS
SELECT
T.TradeDrugId
, T.GenericDrugId
, T.TradeName
, G.GenericProprietaryName
, G.DosageType
, G.Strength
, T.TradeName + ',' + G.GenericProprietaryName + ',' + G.DosageType
+ ',' + G.Strength AS TradeFullName
FROM dbo.TradeDrug AS T
INNER JOIN Inventory.GenericDrug AS G
ON T.GenericDrugId = G.GenericId
GO
我建议在 WHERE 子句中加入 "AND SOI.SoldOut <> 1" 而不是加入条件
问题出在SOI.SoldOut <> 1
首先,正如 Pouya Kamyar 指出的那样,将其包含在 WHERE
子句中比在 JOIN
.
中更常规
但是,问题是这个字段的值主要是NULL
。
你想要的更像这样:
WHERE SOI.SoldOut IS NULL
OR SOI.SoldOut <> 1
将售罄中的空数据更改为 0 或 1 或...
处理空值,以便布尔比较结果为真或假,而不是如下所示的 "NULL"。
SELECT TOP (100) PERCENT
SOI.InStockPrdID
, SOI.ProdName
, SOI.TradeDrugId
, ISNULL(SOI.Quantity, 0) AS INQTY
, ISNULL(SCI.QuantitySold, 0) AS OUTQTY
, ISNULL(SOI.Quantity, 0) - ISNULL(SCI.QuantitySold, 0) AS AQTY
, SOI.UnitPrice
FROM dbo.StockInventory AS SOI
LEFT OUTER JOIN dbo.StockCloseInventory AS SCI
ON SOI.InStockPrdID = SCI.InStockPrdID
AND ISNULL(SOI.SoldOut,0) <> 1 -- this should do the trick
LEFT OUTER JOIN dbo.vwTradeDrug AS VTD
ON SOI.TradeDrugId = VTD.TradeDrugId
ORDER BY SOI.ProdName
请记住,对 Null 值进行布尔比较会导致 NULL(布尔比较中的第三个值!)因此 SOI.SoldOut <> 1 当 SOI.SoldOut 为 null 时将导致 NULL 而不是 true/false 你在期待。
我的查询没有给出正确的输出。
我也尝试过其他方法,例如 CTE,但没有任何帮助。
我正在尝试编写 View 来显示可用产品的数量,但由于某些数据在 StockCloseInventory 中不可用 table 它显示我 0,即使某些产品的记录可用。
这是我的查询:
SELECT TOP (100) PERCENT
SOI.InStockPrdID
, SOI.ProdName
, SOI.TradeDrugId
, ISNULL(SOI.Quantity, 0) AS INQTY
, ISNULL(SCI.QuantitySold, 0) AS OUTQTY
, ISNULL(SOI.Quantity, 0) - ISNULL(SCI.QuantitySold, 0) AS AQTY
, SOI.UnitPrice
FROM dbo.StockInventory AS SOI
LEFT OUTER JOIN dbo.StockCloseInventory AS SCI
ON SOI.InStockPrdID = SCI.InStockPrdID
AND SOI.SoldOut <> 1
LEFT OUTER JOIN dbo.vwTradeDrug AS VTD
ON SOI.TradeDrugId = VTD.TradeDrugId
ORDER BY SOI.ProdName
这是我的视图的输出:
这是我的 Tables
Table:库存
Table:库存关闭库存
vwTradeDrug 视图:
CREATE VIEW [dbo].[vwTradeDrug]
AS
SELECT
T.TradeDrugId
, T.GenericDrugId
, T.TradeName
, G.GenericProprietaryName
, G.DosageType
, G.Strength
, T.TradeName + ',' + G.GenericProprietaryName + ',' + G.DosageType
+ ',' + G.Strength AS TradeFullName
FROM dbo.TradeDrug AS T
INNER JOIN Inventory.GenericDrug AS G
ON T.GenericDrugId = G.GenericId
GO
我建议在 WHERE 子句中加入 "AND SOI.SoldOut <> 1" 而不是加入条件
问题出在SOI.SoldOut <> 1
首先,正如 Pouya Kamyar 指出的那样,将其包含在 WHERE
子句中比在 JOIN
.
但是,问题是这个字段的值主要是NULL
。
你想要的更像这样:
WHERE SOI.SoldOut IS NULL
OR SOI.SoldOut <> 1
将售罄中的空数据更改为 0 或 1 或...
处理空值,以便布尔比较结果为真或假,而不是如下所示的 "NULL"。
SELECT TOP (100) PERCENT
SOI.InStockPrdID
, SOI.ProdName
, SOI.TradeDrugId
, ISNULL(SOI.Quantity, 0) AS INQTY
, ISNULL(SCI.QuantitySold, 0) AS OUTQTY
, ISNULL(SOI.Quantity, 0) - ISNULL(SCI.QuantitySold, 0) AS AQTY
, SOI.UnitPrice
FROM dbo.StockInventory AS SOI
LEFT OUTER JOIN dbo.StockCloseInventory AS SCI
ON SOI.InStockPrdID = SCI.InStockPrdID
AND ISNULL(SOI.SoldOut,0) <> 1 -- this should do the trick
LEFT OUTER JOIN dbo.vwTradeDrug AS VTD
ON SOI.TradeDrugId = VTD.TradeDrugId
ORDER BY SOI.ProdName
请记住,对 Null 值进行布尔比较会导致 NULL(布尔比较中的第三个值!)因此 SOI.SoldOut <> 1 当 SOI.SoldOut 为 null 时将导致 NULL 而不是 true/false 你在期待。