有一個資料庫,其中包含一個表,其中一列用于作業訂單編號,一列用于作業訂單必須/已經完成的流程。例如,工單 1 可能有 3 個不同的條目,第一個條目包含擠壓,第二個條目包含鋸切,另一個包含運輸。有沒有辦法可以撰寫查詢來查找所有缺少鋸切程序的工單?所以在一張看起來像的桌子上:
| 作業指示 | 程序 |
|---|---|
| 1 | 擠壓 |
| 1 | 鋸 |
| 1 | 船 |
| 2 | 擠壓 |
| 2 | 船 |
| 3 | 擠壓 |
| 3 | 鋸 |
| 3 | 船 |
我想要一個可以識別作業訂單 2 缺少 SAW 流程的查詢。我被卡住了,因為我能想到的唯一查詢都涉及 using WHERE PROCESS != 'SAW',但這顯然只會回傳其他行程。不確定表格的設定方式是否可行,但感謝您提供任何幫助。
uj5u.com熱心網友回復:
一種更通用的方法來查找缺失的內容。
它生成一組完整的預期資料,并EXCEPT針對現有表使用運算子來揭示丟失的內容。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (Workorder INT, Process VARCHAR(20));
INSERT INTO @tbl (Workorder, Process) VALUES
(1, 'Extrusion'),
(1, 'Saw'),
(1, 'Ship'),
(2, 'Extrusion'),
(2, 'Ship'),
(3, 'Extrusion'),
(3, 'Saw'),
(3, 'Ship');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT DISTINCT Workorder FROM @tbl
)
SELECT * FROM rs
CROSS APPLY (VALUES
('Extrusion'),
('Saw'),
('Ship')) AS t(Process)
EXCEPT
SELECT * FROM @tbl;
輸出
----------- ---------
| Workorder | Process |
----------- ---------
| 2 | Saw |
----------- ---------
uj5u.com熱心網友回復:
您可能希望使用不存在子句,如下所示。
SELECT
WorkOrder
FROM thetablename t
WHERE NOT EXISTS
(
SELECT
WorkOrder
FROM thetablename tn
WHERE tn.Process ='Saw'
AND tn.WorkOrder = t.WorkOrder
)
uj5u.com熱心網友回復:
我認為您只需要找到缺少全部流程的作業訂單 - 您不想硬編碼“Saw”,它可以是任何,所以只需計算每個作業訂單的不同流程的數量并與最多行程數:
with w as (
select workorder, Count(*) qty
from t
group by workorder
)
select workorder
from w
where qty < (select Max(qty) from w);
uj5u.com熱心網友回復:
使用組
Select workorder
From table
Group By workorder
Having count(distinct lower(process) ='saw') = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311542.html
標籤:sql sql-server 查询语句
