我的查询没有得到正确的值

时间:2016-04-25 11:35:59

标签: sql sql-server sql-server-2008 sql-server-2008-r2 left-join

我的查询没有给出正确的输出。

我尝试了不同的方式,例如CTE,但没有任何帮助。

我正在尝试编写View以显示包含数量的可用产品,但由于某些数据在StockCloseInventory表中不可用,因此即使某些产品的记录可用,它也会显示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

这是我的视图的输出: enter image description here

这是我的桌子

表:StockInventory enter image description here

表:StockCloseInventory enter image description here

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

3 个答案:

答案 0 :(得分:1)

我建议带来&#34; AND SOI.SoldOut&lt;&gt; 1&#34;在WHERE子句中没有加入术语

答案 1 :(得分:1)

问题在于SOI.SoldOut <> 1

首先,正如Pouya Kamyar指出的那样,将WHERE条款包含在JOIN条款中而不是NULL中更为常规。

但问题是,此字段的值大多为WHERE SOI.SoldOut IS NULL OR SOI.SoldOut <> 1

你想要的是更像这样的东西:

.no-scroll::-webkit-scrollbar {display:none;} /* Safari */
.no-scroll::-moz-scrollbars {display:none;}
.no-scroll::-o-scrollbar {display:none;} /* opera */
.no-scroll::-google-ms-scrollbar {display:none;}
.no-scroll::-khtml-scrollbar {display:none;}

答案 2 :(得分:0)

将售罄的空数据更改为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&lt;&gt; 1当SOI.SoldOut为null时,将导致NULL而不是您期望的true / false。