У меня есть 2 столбца (Время и Материал), и я хочу их подвести. Проблема в том, что я получаю сумму только в том случае, если у меня есть данные, которые являются «Истинными» в них обоих. Так что, если у меня есть Время, которое является «Истинным», и есть только Материал, который является «Ложным», я ничего не верну. Пожалуйста, помогите

 SELECT ((SELECT ROUND(SUM([Time]*[Price]),0)  FROM [tblTime] Y WHERE Y.[OwnerId] = <ID> AND Y.[Invoice] = 'True') 
+
(SELECT ROUND(SUM([Amount]*[Price]),0)  FROM [tblMaterial] M WHERE M.[OwnerId] = <ID> AND M.[Invoice] = 'True'))
0
Kristoffer 2 Янв 2016 в 22:25

2 ответа

Лучший ответ

Если одно из ваших полей не равно True, вы фактически получаете значение NULL в этом компоненте, а когда вы добавляете NULL и любое число, результатом всегда будет NULL.

Чтобы решить эту проблему, вы можете использовать функцию COALESCE, чтобы убедитесь, что если ваше значение равно NULL, то COALESCE использует резервное значение 0:

SELECT COALESCE(
    (SELECT ROUND(SUM([Time]*[Price]),0)  
     FROM [tblTime] Y 
     WHERE Y.[OwnerId] = <ID> AND Y.[Invoice] = 'True')
    , 0)    -- value 0 is used only if SELECT returns NULL
+
COALESCE(
    (SELECT ROUND(SUM([Amount]*[Price]),0)  
     FROM [tblMaterial] M 
     WHERE M.[OwnerId] = <ID> AND M.[Invoice] = 'True')
    , 0)    -- value 0 is used only if SELECT returns NULL
0
dotnetom 2 Янв 2016 в 19:39

Возможно, есть проблемы с NULL

 SELECT (
    ISNULL(
       SELECT ROUND(SUM([Time]*[Price]),0)  
       FROM [tblTime] Y
       WHERE Y.[OwnerId] = <ID> AND Y.[Invoice] = 'True'
       , 0) 
    +
    ISNULL(
        SELECT ROUND(SUM([Amount]*[Price]),0) 
        FROM [tblMaterial] M 
        WHERE M.[OwnerId] = <ID> AND M.[Invoice] = 'True'
        , 0)
    )
0
James A Mohler 2 Янв 2016 в 19:33