oracle SQL -如何查找缺少某些预期条件的所有条目?

q3qa4bjr  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(107)

我在一家生产微芯片的工厂工作。
微芯片是以10,000个为一批制造的,其制造的最后阶段涉及到它们通过一台以各种方式检查它们的机器。
下图所示为批次ID 1402361301中1号微芯片的样本表。
| 批号|微芯片系列|检查_ID|地位|
| --|--|--|--|
| 1402361301 | 1 | 35 | 1 |
| 1402361301 | 1 | 36 | 1 |
| 1402361301 | 1 | 37 | 1 |
| 1402361301 | 1 | 38 | 1 |
| 1402361301 | 1 | 39 | 1 |
| 1402361301 | 1 | 40 | 1 |
| 1402361301 | 1 | 41 | 1 |
| 1402361301 | 1 | 42 | 1 |
| 1402361301 | 1 | 43 | 1 |
| 1402361301 | 1 | 52 | 1 |
| 1402361301 | 1 | 53 | 1 |
| 1402361301 | 1 | 49 | 1 |
从表中可以看出,共有12个检查ID。最后一个是Inspection_ID 49。
据我所知,任何状态为1且Inspection_ID为49的Microchip都应该有其他11个Inspection。
如何使用SQL显示状态为1且检查ID为49的条目缺少这11个检查中的任何一个?
(额外提示:我可以选择缺少所有11项检验、缺少任何1项检验或缺少1项特定检验的条目吗?)

q5lcpyga

q5lcpyga1#

您可以使用GROUP BYHAVING并使用条件聚合来查找具有正确检验和状态的批次及其检验计数:

SELECT lot_id,
       COUNT(*) AS num_inspections
FROM   table_name
GROUP BY lot_id
HAVING COUNT(CASE WHEN inspection_id = 49 AND status = 1 THEN 1 END) > 0

如果要查找检验数为49且状态为1的批次,且检验数少于12:

SELECT lot_id,
       COUNT(*) AS num_inspections
FROM   table_name
GROUP BY lot_id
HAVING COUNT(CASE WHEN inspection_id = 49 AND status = 1 THEN 1 END) > 0
AND    COUNT(*) < 12

如果您想检查是否缺少特定检查,则:

SELECT lot_id,
       COUNT(*) AS num_inspections
FROM   table_name
GROUP BY lot_id
HAVING COUNT(CASE WHEN inspection_id = 49 AND status = 1 THEN 1 END) > 0
AND    COUNT(CASE WHEN inspection_id = 35 THEN 1 END) = 0
3zwtqj6y

3zwtqj6y2#

交叉连接检查与已完成的检查。然后使用NOT EXISTS查找表中缺少的检查。

with
  completed as
  (
    select lot_id, microchip_serial
    from lot_inspection
    where inspection_id = 49 and status = 1
  )
select c.lot_id, c.microchip_serial, i.inspection_id
from completed c
cross join inspection i
where not exists
(
  select null
  from lot_inspection li 
  where li.lot_id = c.lot_id 
  and li.microchip_serial = c.microchip_serial
  and li.inspection_id = i.inspection_id
)
order by c.lot_id, c.microchip_serial, i.inspection_id;

我希望有一个检查表,因为您有一个名为inspection_id的列。如果没有,则在数据库中创建一个one-the-fly或。如果存在检查表,但它包含其他检查ID,则使用另一个CTE仅选择所需的ID。

相关问题