![](/img/trans.png)
[英]SQL Case when at least one value equals value then set to value
[英]SQL CASE when value equals zero, return value from another row with identical values
我正在編寫一個 SQL 查詢,該查詢返回零件號、作業操作以及完成每個操作所需的時間。
時間從前端 ERP 系統輸入。
有時作業操作時間會被錯誤地留空,這會導致在表中輸入時間 0(零)。
如果時間值為零,我想用另一行的時間填充時間值,其中作業操作和部件號與當前行相同,時間值也不為零。
如果沒有找到除零以外的值,則只需使用零。
SELECT
B.[PartNo] AS [Part],
A.[JobOpNo] AS [Operation],
A.[JobAllocatedTime] AS [ALLOCATED TIME],
-- (CASE
-- WHEN A.[JobAllocatedTime] = 0 THEN (SELECT [JobAllocatedTime] FROM [JobOperations] WHERE (the Part & Operation are the same as this rows Part & Operation AND the Allocated Time is Not = 0 , if no number other than zero is found the use 0)
-- ELSE A.[JobAllocatedTime] END) AS [ALLOCATED TIME]
FROM
[JobOperations] A
JOIN
[JobOrders] B ON A.[JobOpOrderNo] = B.[OrderNo]
ORDER BY
A.[JobOpOrderNo] DESC
我這里有一個小提琴。
數據庫為 Microsoft SQL Server 2017
我可以使用存儲過程來實現這一點,但是,我想知道是否有更基本的方法來實現這一點,可能使用內置命令 / function。
如果我理解正確,您可以使用 window 函數:
SELECT jo.PartNo AS [Part],
jop.JobOpNo AS [Operation],
(CASE WHEN jop.JobAllocatedTime = 0
THEN MAX(jop.JobAllocatedTime) OVER (PARTITION BY jo.PartNo, jop.JobOpNo)
ELSE jop.JobAllocatedTime
END) AS [ALLOCATED TIME]
FROM JobOperations jop JOIN
JobOrders jo
ON jop.[JobOpOrderNo] = jo.[OrderNo]
ORDER BY 1, 2
ORDER BY jop.[JobOpOrderNo] DESC;
這是一個 db<>fiddle。
這將根據您的條件計算最大值並用該值替換0
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.