簡體   English   中英

SQL CASE 當值為零時,從具有相同值的另一行返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM