如果组满足条件,则从GROUP BY组中选择ID

时间:2013-09-05 04:09:39

标签: sql select group-by

我正在开发一个Access数据库,该数据库保存到达仓库并从仓库发货的所有不同批次的记录。仓库中的位置由Lot_ID表示 该表包含以下数据:

Batch_ID | Lot_ID |Arrival_date | Shipping_date
------------------------------------------------------
1        |  1     | 2013/7/08   | 2013/8/21 
2        |  2     | 2013/7/10   |   
3        |  3     | 2013/7/15   | 2013/8/28 
4        |  1     | 2013/7/22   | 2013/8/23 
5        |  3     | 2013/8/12   |   

我正在尝试编写一个只显示当前未被占用的Lot_ID的查询。

问题出现是因为该表包含当前和历史数据。我的想法是按Lot_ID对表进行分组,并仅选择组中每行的Shipping_date不为空的那些组(这意味着批次中存储的每个批次已经发货,目前批次是免费的)

结果将是:

Batch_ID  
--------- 
1     

那么在这种情况下使用什么SQL查询会更好?

3 个答案:

答案 0 :(得分:0)

您应该查看以下链接 http://www.w3schools.com/sql/sql_where.asp

应该使用caluse,例如'where shipping = null'

答案 1 :(得分:0)

选择发货日期不为空且批次ID没有空的发货日期的所有批次ID。

内部查询将为您提供尚未发货的所有批次,这意味着它们不是免费的。

SELECT DISTINCT LOT_ID
FROM tableName
WHERE Shipping_date IS NOT NULL 
      AND LOT_ID NOT IN (SELECT DISTINCT LOT_ID
                          FROM tableName
                          WHERE Shipping_date IS NULL)

即使选择没有空的发货日期的所有批次ID也应该有效

SELECT DISTINCT LOT_ID
FROM tableName
WHERE  LOT_ID NOT IN (SELECT DISTINCT LOT_ID
                          FROM tableName
                          WHERE Shipping_date IS NULL)

答案 2 :(得分:0)

尝试

SELECT Lot_ID
  FROM Table1
 GROUP BY Lot_ID
HAVING SUM(IIF(Shipping_date IS NULL, 1, 0)) = 0

输出:

|Lot_ID |
|-------|
|     1 |