sql server—sql case当值等于零时,从另一行返回值并具有相同的值

ruoxqz4g  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(443)

我正在编写一个sql查询,它返回零件号、作业操作以及完成每个操作所需的时间。
时间是从前端erp系统输入的。
有时作业操作时间错误地留空,这导致表中输入的时间为0(零)。
如果时间值为零,我想填充另一行的时间,其中作业操作和零件号与当前行相同,时间值也不是零。
如果找不到除0以外的值,则只使用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
我可以使用存储过程来实现这一点,但是,我想知道是否有更基本的方法来实现这一点,可能是使用内置的命令/函数。

ao218c7q

ao218c7q1#

如果我理解正确,您可以使用窗口函数:

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;

这是一把小提琴。
这将根据您的条件计算最大值并替换 0 具有该值的值。

相关问题