Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL情况下,当值等于零时,从另一行返回具有相同值的值_Sql_Sql Server_Case - Fatal编程技术网

SQL情况下,当值等于零时,从另一行返回具有相同值的值

SQL情况下,当值等于零时,从另一行返回具有相同值的值,sql,sql-server,case,Sql,Sql Server,Case,我正在编写一个SQL查询,它返回零件号、作业操作以及完成每个操作所需的时间 时间是从前端ERP系统输入的 有时作业操作时间错误地留空,这导致表中输入的时间为0(零) 如果时间值为零,则我希望填充另一行的时间,其中作业操作和零件号与当前行相同,并且时间值也不是零 如果没有找到除零以外的值,则只使用零 SELECT B.[PartNo] AS [Part], A.[JobOpNo] AS [Operation], A.[JobAllocatedTime] AS [ALLOC

我正在编写一个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


我可以使用存储过程来实现这一点,但是,我想知道是否有更基本的方法来实现这一点,可能是使用内置命令/函数。

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

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
值。

如果有多个匹配值,该怎么办?@marc_s-我将编辑该问题。必须是SQL Server 2017,SQL Management Studio 2018-很难跟踪Microsoft@GordonLinoff-我希望这就是专家建议的来源-我想返回的最大数量会起作用。这似乎起了作用-在更大的数据集上运行一些测试