SQL情况下,当值等于零时,从另一行返回具有相同值的值
我正在编写一个SQL查询,它返回零件号、作业操作以及完成每个操作所需的时间 时间是从前端ERP系统输入的 有时作业操作时间错误地留空,这导致表中输入的时间为0(零) 如果时间值为零,则我希望填充另一行的时间,其中作业操作和零件号与当前行相同,并且时间值也不是零 如果没有找到除零以外的值,则只使用零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
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-我希望这就是专家建议的来源-我想返回的最大数量会起作用。这似乎起了作用-在更大的数据集上运行一些测试