TSQL — Процентное вычисление не работает

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я создал подзапросы, которые возвращают количество, например, ниже;

Я пытаюсь закодировать их как LH / (GN MarketRent Commercial) * 100, но там, где есть значение для вычисления, запрос возвращает значение null.

подзапрос, который присоединяется к основному запросу, используя left outer .

 SELECT        BLOCKS.[BLOCK-REF] AS [BLOCK-SUBB-REF], count(BLOCKS.[PLACE-REF]) NoOfMR
FROM            [SQLViewsPro2EOD].[dbo].[IH-LOCATION] AS BLOCKS INNER JOIN
                         [SQLViewsPro2EOD].[dbo].[IH-LOCATION] AS SUBB ON BLOCKS.[BLOCK-REF] = SUBB.[PLACE-REF] 
                         AND SUBB.[LOCATION-TYPE] IN ('BLOCK', 'SUBBLOCK', 'CBLOCK', 'HOSTEL', 'SCHEME') --and  SUBB.[BLOCK-REF] <> ''
                         and BLOCKS.[LOCATION-TYPE] in ('FLAT', 'BEDSIT', 'BUNG', 'DUPLEX', 'ENDTER', 'GFLAT', 'GFLATOG', 'HOSTEL', 'HOUSE', 'MAISON', 'SEMDET', 'ROOM'
                         ,'BLOCK', 'SUBBLOCK', 'CBLOCK', 'HOSTEL', 'SCHEME')
                        right JOIN  [DBAdmin].[dbo].[BusinessPlanTenureMap] bp on bp.[ESTATE-CODE] = BLOCKS.[ESTATE-CODE]
WHERE 
bp.[Business Plan Tenure] = 'MARKET RENTAL' and
(BLOCKS.[LOCATION-STS] <> 'D')
group by BLOCKS.[BLOCK-REF]
 

Это код, который я создал до сих пор, принимая во внимание ошибку деления на ноль в основном запросе. В столбце% арендаторов отображаются значения null, а не вычисление%.

 ,cast(nullif(isnull(lhso.[NoOfLH-SO],0),0) as int)/ cast(nullif(isnull(gen.NoOfGN,0),0)   nullif(isnull(lhso.[NoOfLH-SO],0),0)   nullif(isnull(cm.NoOfCM,0),0) as int) * 100 '% leaseholder'
 

введите описание изображения здесь

 GN  LH/SO   MARKET RENTAL   COMMERCIAL  % Leaseholders
0   0   0   0   0.00
4   2   0   0   14.29
2   2   0   0   16.67
0   0   0   0   0.00
3   1   0   0   12.50
1   3   0   0   75.00
 

Таблица является ожидаемым результатом

Любые советы приветствуются. Спасибо

Спасибо, Джереми, эта часть запроса работает, она суммируется.

 cast(isnull((nullif((isnull(gen.NoOfGN,0) 
  isnull(lhso.[NoOfLH-SO],0) 
 isnull(mr.NoOfMR,0)
 isnull(rl.NoOfRL,0) 
 isnull(cm.NoOfCM,0) 
 isnull(hs.NoOfHS,0)
 isnull(op.NoOfOP,0)
 isnull(sh.NoOfSH,0) 
 isnull(ec.NoOfEC,0) ),0)),0)as int) Total
 

но когда я добавляю это

 isnull(nullif(lhso.[NoOfLH-SO],0),0) / 
 

в переднюю часть он возвращает сообщение об ошибке
Обнаружена ошибка деления на ноль.

Я думаю, что я учитывал значения null…

Комментарии:

1. Потратьте время на публикацию использованных выборочных данных и ожидаемых результатов, предпочтительно в виде инструкций DDL и DML. У нас нет доступа к вашему экземпляру, и у нас нет копии ваших данных, поэтому мы не знаем, почему то, что у вас есть, не работает.

2. я попробую применить экстрасенсорную отладку: вы используете правильное соединение. всякий раз, когда вы используете соединение «внешнего» типа, будь то right или left, если запись не совпадает, у вас есть возможность для нулевого значения. Я бы посмотрел за пределы вычисления и убедился, что вы правильно объединяете таблицы, прежде чем обвинять ваш расчет.

3. Спасибо, Джереми, эта часть запроса работает, она суммируется. cast(isnull((nullif((isnull(gen.NoOfGN,0) isnull(lhso. [NoOfLH-SO],0) isnull(mr.NoOfMR,0) isnull(rl.NoOfRL,0) isnull(cm.NoOfCM,0) isnull(hs.NoOfHS,0) isnull(op.NoOfOP,0) isnull(sh.NoOfSH,0) isnull(ec.NoOfEC,0) ),0)),0) как int) Итого, но когда я добавляю это isnull(nullif(lhso. [NoOfLH-SO],0),0) / для передней части он возвращает ошибку, разделенную на нулевую ошибку. Я думаю, что я учитывал значения null…

4. вы используете nullif, который превратит значение 0 в NULL. возможно, вы хотите попробовать «метод 2», как описано в этой статье: sqlshack.com/methods-to-avoid-sql-divide-by-zero-error

5. Я попробовал метод 2, но безуспешно, isnull работает сам по себе, только когда я пытаюсь разделить результаты, они вообще не складываются. (случай, когда lhso. [NoOfLH-SO] = null, тогда 0 еще приведено (isnull(lhso. [NoOfLH-SO],0) как int) end) / cast(isnull(gen.NoOfGN,0) isnull(lhso. [NoOfLH-SO],0) isnull(mr.NoOfMR,0) isnull(rl.NoOfRL,0) isnull(cm.NoOfCM,0) isnull(hs.NoOfHS,0) isnull(op.NoOfOP,0) isnull(sh.NoOfSH,0) isnull(ec.NoOfEC,0) как int) Итого