【问题标题】:My query doesn't get the right value我的查询没有得到正确的值
【发布时间】:2016-04-25 11:35:59
【问题描述】:

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

我也尝试了不同的方法,例如 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

这是我的视图的输出:

这是我的表格

表:库存库存

表:StockCloseInventory

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

【问题讨论】:

  • 你的问题到底是什么?预期的输出是多少?
  • 已售出数量未显示,显示为 0,但我的产品有库存CloseInventory
  • AND coalesce(SOI.SoldOut,0) &lt;&gt; 1 NULL 在布尔比较中总是评估为 NULL,除非您使用特定的 is null 评估;所以这不是真的,也不是假的。它是 Null,这意味着它既不是 = 1 也不是 1,因此所有记录都从左连接中排除,除了您要排除的记录 (10) :P 或 and ISNULL(SOI.SoldOut,0) 保持一致。

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


【解决方案1】:

问题在于SOI.SoldOut &lt;&gt; 1

首先,正如 Pouya Kamyar 指出的那样,将其包含在 WHERE 子句中比包含在 JOIN 中更为传统。

但是,问题是这个字段的值大多是NULL

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

WHERE SOI.SoldOut IS NULL 
   OR SOI.SoldOut <> 1

【讨论】:

    【解决方案2】:

    我建议在 WHERE 子句中加入“AND SOI.SoldOut 1”而不是加入条款

    【讨论】:

      【解决方案3】:

      将已售罄的空数据更改为 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 而不是您期望的真/假。

      【讨论】:

      • 您的查询实际上帮助我获取了已售数量的数据,但它无法消除已售出的记录,例如InStockPrdID:10 已售罄,在您的查询中它仍然出现。但是当我尝试使用@joel brown 时,它可以工作。
      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多