Excel VBA SQL SUM из пустого набора записей не возвращает ноль - PullRequest
0 голосов
/ 13 сентября 2018

Я хотел бы использовать подзапрос, который возвращает сумму столбца, что-то вроде:

3 + SELECT SUM(field) FROM some-table WHERE some-criteria

Когда критерии приводят к 0 записям, подзапрос не возвращает 0, поэтому весь запрос завершается ошибкой и ничего не возвращает (ничего с нулевой длиной).

Когда есть записи, все работает хорошо.

Я пытался SUM(IIF(field IS NULL, 0 , field) FROM..., но поведение не меняется.

Это подзапрос, изолированный от запроса большего размера:

strSQL = "SELECT SUM(IIF(RCTPAY2.[Sum Paid] IS NULL ,0 , RCTPAY2.[Sum Paid])) FROM [Receivables$B10:K32] AS RCTPAY2 WHERE RCTPAY2.[Invoice Number]=500009 AND RCTPAY2.[Method]='Tax Deduct'"

Как я могу сделать так, чтобы это всегда возвращало действительное число (0, если нет записей или Сумма поля, если есть записи)?

Это провайдер, которого я использую:

strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;"

EDIT : По запросу JNevill я копирую полный SQL-запрос. Ищите HDR.[Total NIS]-(SELECT SUM:

SELECT 'C100'+'000000000'+'024227357' + '320' + 
       FORMAT(HDR.[Invoice Number],'00000000000000000000') + 
       IIF(ISNULL(HDR.[Print DateTime]),'            ', 
           FORMAT(HDR.[Print DateTime],'YYYYMMDDHHMM')), 
           LEFT(TRIM(HDR.[Customer Name])+'                                                  ',50),  
       IIF(ISNULL(CST.[Bill To: Address1]), '                                                  ',  
           LEFT(TRIM(CST.[Bill To: Address1])+'                                                  ',50)),  
       IIF(ISNULL(CST.[Bill To: Address4]), '          ',  
           LEFT(TRIM(CST.[Bill To: Address4])+'          ',10)),
       IIF(ISNULL(CST.[Bill To: Address2]), 
           '                              ',  
           LEFT(TRIM(CST.[Bill To: Address2])+'                              ',30)),  
       IIF(ISNULL(CST.[Bill To: Address3]), '        ',  
           LEFT(TRIM(CST.[Bill To: Address3])+'        ',8)), 
       IIF(ISNULL(CNTRY.[Country]), 
           '                              ',  
           LEFT(TRIM(CNTRY.[Country])+'                              ',30)),
       IIF(ISNULL(CST.[Bill To: Address5]), '  ',  CST.[Bill To: Address5]), 
       IIF(ISNULL(CST.[Phone]), '               ',  
           LEFT(TRIM(CST.[Phone])+'               ',15)) ,  
       IIF(ISNULL(CST.[Company ID]), '000000000',  
           FORMAT(CST.[Company ID],'000000000')) + 
           (SELECT FORMAT(RCTPAY.[Date],'YYYYMMDD') 
            FROM [ùåøåú ú÷áåìéí$B10:K32] AS RCTPAY 
            WHERE RCTPAY.[Invoice Number]=HDR.[Invoice Number] 
              AND RCTPAY.[Line Number]=1) +  
                  IIF(True, 
                      IIF(HDR.[Currency]<>'ù÷ì çãù', 
                          FORMAT(100*HDR.[Total], IIF(HDR.[Total]<0, 
                                                      '00000000000000',
                                                      '+00000000000000')), 
                      '               '), '               ') +  
                  IIF (True, 
                       IIF(HDR.[Currency]<>'ù÷ì çãù', 
                           CUR.[IRS Code], '   '), 
                       '   ') + 
                  FORMAT(100*(HDR.[Subtotal] * HDR.[Exchange Rate]),
                  IIF(HDR.[Subtotal]<0,'00000000000000','+00000000000000')) +
                  IIF(ISNULL(HDR.[Discount%]),'               ', 
                      FORMAT(ABS(100*(HDR.[Subtotal] * HDR.[Discount%])),
                  IIF(HDR.[Subtotal]<0,'+000000000000000',
                      '-00000000000000'))) + 
                  FORMAT(100*(HDR.[Total In Currency] * HDR.[Exchange Rate]),
                         IIF(HDR.[Total In Currency]<0,
                             '00000000000000','+00000000000000')) + 
                  FORMAT(100*(HDR.[VAT] * HDR.[Exchange Rate]),
                         IIF(HDR.[VAT]<0,'00000000000000','+00000000000000')) + 
                  FORMAT(100*(HDR.[Total NIS]-
                         (SELECT SUM(RCTPAY2.[Sum Paid]) 
                          FROM [ùåøåú ú÷áåìéí$B10:K32] AS RCTPAY2 
                          WHERE RCTPAY2.[Invoice Number]=HDR.[Invoice Number] 
                            AND RCTPAY2.[Method]='ðéëåé îñ áî÷åø')),
                         IIF(HDR.[Total NIS]<0,
                             '00000000000000','+00000000000000')) + 
                  FORMAT(100*(SELECT SUM(RCTPAY3.[Sum Paid]) 
                              FROM [ùåøåú ú÷áåìéí$B10:K32] AS RCTPAY3 
                              WHERE RCTPAY3.[Invoice Number]=HDR.[Invoice Number] 
                                AND RCTPAY3.[Method]='ðéëåé îñ áî÷åø'),
                        '+00000000000') +  
                  FORMAT(HDR.[Customer Number],'000000000000000') +
                         IIF(ISNULL(HDR.[Source Invoice]), '          ', 
                             RIGHT('          ' + 
                             FORMAT(HDR.[Source Invoice],'##########'), 10)) +  
                         IIF(HDR.[Status]='îáåèìú','1',' ') +  
                             FORMAT(HDR.[Date],'YYYYMMDD') + '       ', 
                                   '         ',  FORMAT(HDR.[Invoice Number],
                                                        '0000000') + '             ' 

FROM ((([çùáåðéåú å÷áìåú$B12:AB55] as HDR 
LEFT JOIN [ì÷åçåú$B12:X20] as CST 
       ON HDR.[Customer Number] = CST.[Customer Number]) 
LEFT JOIN [èáìàåú$ET12:EU254] as CNTRY 
       ON CST.[Bill To: Address5] = CNTRY.[Code]) 
LEFT JOIN [èáìàåú$K10:O25] as CUR 
       ON HDR.[Currency] = CUR.[Currency]) 
WHERE HDR.[Date]>=43101 
  AND HDR.[Date]<=43465 
  AND HDR.[Status]<>'îîúéðä' 
  AND HDR.[Invoice Type]='çùáåðéú îñ/÷áìä'

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Решением, которое сработало для меня, в конечном итоге был IIF, который проверяет, больше ли COUNT записей по тем же критериям, чем ноль, и затем я применяю команду SUM. Что-то вроде:

3 + IIF((SELECT(COUNT(*) FROM some-table WHERE some-criteria)=0,0, (SELECT SUM(field) FROM some-table WHERE some-criteria)
0 голосов
/ 13 сентября 2018

Это ваш запрос:

SELECT SUM(IIF(RCTPAY2.[Sum Paid] IS NULL ,0 , RCTPAY2.[Sum Paid]))
FROM [Receivables$B10:K32] AS RCTPAY2
WHERE RCTPAY2.[Invoice Number] = 500009 AND RCTPAY2.[Method] = 'Tax Deduct';

Вы думаете: "Черт возьми, это никогда не должно возвращаться NULL, потому что я проверяю его в IIF()".Но вы что-то упускаете: что, если нет строк?Это проблема, с которой вы столкнулись.

Итак, вместо IIF() до SUM() проведите сравнение после * SUM().Также используйте NZ() вместо IIF().Итак:

SELECT NZ(SUM(RCTPAY2.[Sum Paid]), 0)
FROM [Receivables$B10:K32] AS RCTPAY2
WHERE RCTPAY2.[Invoice Number] = 500009 AND RCTPAY2.[Method] = 'Tax Deduct';

SUM() игнорирует NULL значения в любом случае, поэтому нет необходимости превращать их в нули.

Если NZ() не работает, попробуйтеФункция стандарта ANSI COALESCE():

SELECT COALESCE(SUM(RCTPAY2.[Sum Paid]), 0)
FROM [Receivables$B10:K32] AS RCTPAY2
WHERE RCTPAY2.[Invoice Number] = 500009 AND RCTPAY2.[Method] = 'Tax Deduct';

Я бы порекомендовал IIF() или IFNULL()NZ()) из отчаяния - это специальные функции, характерные для базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...