2016-04-06 67 views
1

我似乎无法弄清楚这里的语法问题。ISNULL语法挑战

这个工作,但返回空值;

SELECT jo.Job_Operation, jo.Job, jo.Work_Center, jo.Operation_Service, jo.Est_Total_Hrs, 
    (SELECT SUM(jot.Act_Run_Hrs) 
    FROM PRODUCTION.dbo.Job_Operation_Time jot 
    WHERE jot.Job_Operation = jo.Job_Operation) AS Cost 
FROM PRODUCTION.dbo.Job_Operation jo 
WHERE jo.Job = 'A5076027' 

所以我想在这里使用ISNULL,但我得到一个错误:

SELECT jo.Job_Operation, jo.Job, jo.Work_Center, jo.Operation_Service, jo.Est_Total_Hrs, 
    (ISNULL(SELECT SUM(jot.Act_Run_Hrs) 
    FROM PRODUCTION.dbo.Job_Operation_Time jot 
    WHERE jot.Job_Operation = jo.Job_Operation,0)) AS Cost 
FROM PRODUCTION.dbo.Job_Operation jo 
WHERE jo.Job = 'A5076027' 

的错误是: 消息156,级别15,状态1,2号线 附近有语法错误的关键字'SELECT'。 Msg 102,Level 15,State 1,Line 4 ','附近的语法不正确。

任何人都可以看到我在这里失踪?

谢谢!

+1

不要做更清晰联接子查询中选择,如果你能避免它。在你的情况下,转换你的查询使用常规连接,然后使用'ISNULL'。 –

+0

你已经有了'ISNULL'的第二个参数嵌套在括号内的一个深层; @Adam Silenko的答案应该可以工作 – WillardSolutions

+0

在这里使用相关的子查询是好的(尽管有些会使用'apply'来代替)。 –

回答

2

试试这个:

SELECT jo.Job_Operation, jo.Job, jo.Work_Center, jo.Operation_Service, jo.Est_Total_Hrs, 
    ISNULL((SELECT SUM(jot.Act_Run_Hrs) 
    FROM PRODUCTION.dbo.Job_Operation_Time jot 
    WHERE jot.Job_Operation = jo.Job_Operation),0) AS Cost 
FROM PRODUCTION.dbo.Job_Operation jo 
WHERE jo.Job = 'A5076027' 
+0

Sum从不返回null,它只是返回0我认为 –

+0

如果没有'not null'值,sum返回null,因为所有的聚合函数都忽略null,也是sum(https://msdn.microsoft.com/pl- pl/library/ms187810%28v = sql.110%29.aspx),子查询也可以返回null ... –

2

我不认为你需要一个相关子查询在这里。这在我看来就像一个标准的左连接是所有必需的。

SELECT jo.Job_Operation 
    , jo.Job 
    , jo.Work_Center 
    , jo.Operation_Service 
    , jo.Est_Total_Hrs 
    , SUM(isnull(jot.Act_Run_Hrs, 0)) AS Cost 
FROM PRODUCTION.dbo.Job_Operation jo 
left join PRODUCTION.dbo.Job_Operation_Time jot ON jot.Job_Operation = jo.Job_Operation 
WHERE jo.Job = 'A5076027' 
GROUP BY 
    jo.Job_Operation 
    , jo.Job 
    , jo.Work_Center 
    , jo.Operation_Service 
    , jo.Est_Total_Hrs 
+1

添加组... –

+0

感谢@AdamSilenko。 :) –

+0

我不认为总计返回null –

2

这是迄今为止在我看来

SELECT 
    jo.Job_Operation, jo.Job, jo.Work_Center, jo.Operation_Service, jo.Est_Total_Hrs 
    ,ISNULL(jot.[SumAct_Run_Hrs],0) AS Cost 
FROM PRODUCTION.dbo.Job_Operation jo 
LEFT JOIN (
    SELECT Job_Operation,SUM(Act_Run_Hrs) [SumAct_Run_Hrs] 
    FROM PRODUCTION.dbo.Job_Operation_Time 
    GROUP BY Job_Operation 
) jot ON jot.Job_Operation = jo.Job_Operation 
WHERE jo.Job = 'A5076027'