#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) Итого