【问题标题】:Restricting WHERE clause to specific SELECT statement in sql将 WHERE 子句限制为 sql 中的特定 SELECT 语句
【发布时间】:2015-03-17 04:08:48
【问题描述】:

我有以下 sql 代码。我使用带有日期间隔的 WHERE 子句。我的问题是我只想在 select 语句的特定部分使用日期间隔。

我想将 WHERE 子句 DATE 限制为我在 QtyInPeriod 和 ProfitInPeriod 上的选择,而不是选择的其他列(Lines.Item、Inventory.ItemAlternative、Inventory.OnHandPhys、Inventory.Allocated、Inventorry.CostPrice、Brand & StockStatus)。

我需要在 2 个单独的 sql 查询中获取数据还是可以将 WHERE DATE 子句限制为仅选择语句的一部分?

SELECT lines.Item,
       Inventory.ItemAlternative,
       Inventory.OnHandPhys,
       Inventory.Allocated,
       Inventory.CostPrice,
       SUM(lines.Invoiced)*-1 AS QtySoldInPeriod,
       (SUM(lines.AmountBase-lines.CostAmount))*-1 AS ProfitInPeriod,
       replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
       Inventory.Optional3 AS StockStatus
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE Inventory.Item = 'ITEM#'
  AND Lines.Date >= 'DATE'
  AND Lines.Date <= 'DATE'
  AND lines.Invoiced < 0
  AND Inventory.Status = 0
  AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
         Inventory.Optional3,
         Inventory.ItemAlternative,
         Inventory.OnHandPhys,
         Inventory.CostPrice,
         vInventoryOptional2Values.Value,
         Inventory.Allocated
HAVING SUM(lines.AmountBase-lines.CostAmount) < 0

编辑: 我尝试过使用子查询,但无法正常工作:

SELECT lines.Item,
       Inventory.ItemAlternative,
       Inventory.OnHandPhys,
       Inventory.Allocated,
       Inventory.CostPrice,
       replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
       Inventory.Optional3 AS StockStatus
  (SELECT SUM(lines.Invoiced)*-1 AS QtySoldInPeriod
   FROM (lines.item
         WHERE Lines.Date >= '2014-01-01'
           AND Lines.Date <= '2014-01-31' ) )
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE Inventory.Item = 'a158wa'
  AND lines.Invoiced < 0
  AND Inventory.Status = 0
  AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
         Inventory.Optional3,
         Inventory.ItemAlternative,
         Inventory.OnHandPhys,
         Inventory.CostPrice,
         vInventoryOptional2Values.Value,
         Inventory.Allocated

【问题讨论】:

  • sqlformat.org 是格式化 SQL 以便于阅读的好方法。这次我替你做了。
  • 根据您想要的具体情况,可以有多个答案。您能否谈谈您想要的答案,而不是 SQL 细节?例如,您是否希望列出所有项目,无论它们是否在该时间段内开具发票?
  • 我正在从 ERP 数据库中获取数据。 “库存”表包含特定产品的库存水平、成本价格等。我需要每个产品的这些列的最新值(今天的日期)。但是我想在特定日期间隔内从 Lines 表中获得每件商品的销售数量和每件商品的利润。问题是设置日期间隔的 WHERE 子句会影响“库存”表中的数据。如果什么都没卖出(表“行”中没有条目,那么我从“库存”表中什么也得不到。我希望这能更好地解释它。
  • 我的第一个想法是在总和中使用 CASE 语句来检查日期...如果在范围内,则将值返回给总和,否则返回零。
  • 我认为您想要的是仅针对具有特定日期间隔的列的子查询。这有帮助吗? stackoverflow.com/questions/16317814/… 那还是做两个查询。

标签: sql sql-server


【解决方案1】:

您应该使用子查询,并且在更新的问题中您的语法错误, 尝试使用,

SELECT lines.Item,
       Inventory.ItemAlternative,
       Inventory.OnHandPhys,
       Inventory.Allocated,
       Inventory.CostPrice,
       replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
       Inventory.Optional3 AS StockStatus,
       (SELECT SUM(l.Invoiced) * -1 
        FROM lines l
        WHERE l.Date >= '2014-01-01'
           AND l.Date <= '2014-01-31' 
           AND l.Item = lines.Item) AS QtySoldInPeriod
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE Inventory.Item = 'a158wa'
  AND lines.Invoiced < 0
  AND Inventory.Status = 0
  AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
         Inventory.Optional3,
         Inventory.ItemAlternative,
         Inventory.OnHandPhys,
         Inventory.CostPrice,
         vInventoryOptional2Values.Value,
         Inventory.Allocated

【讨论】:

  • 我收到一个错误:Msg 156, Level 15, State 1, Line 1 关键字“AS”附近的语法不正确。如果我删除“AS QtySoldInPeriod”,我会得到:Msg 156, Level 15, State 1, Line 14 关键字“FROM”附近的语法不正确。
【解决方案2】:

你不能。形式上,查询返回一组行,并将 WHERE 子句作为过滤器应用于该组行。也就是说,被过滤的是一组行,而不是特定的列。

考虑使用联合运算符来组合两个选择语句。

【讨论】:

  • 您在技术上是正确的,但是可以解决 OP 的问题。只是不能单独使用 WHERE 子句。
  • 所以我需要将查询一分为二,否则最好的解决方案是什么? - 没有看到上面的答案
  • 考虑使用联合运算符。 (已编辑)
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多