2015-04-15 3 views
1

Когда я пытаюсь разделить первый вложенный оператор select на количество столбцов, запрос возвращает нуль. Когда я заменяю «/» на «,», я получаю два разных числа, поэтому возвращаемое значение не должно быть равным нулю. Может ли это иметь какое-то отношение к тому, что в наборе данных есть нули? Любая помощь была бы оцененаЗапрос, возвращающий нуль при делении в операторе select

declare @hospitalfk int; 
set @hospitalfk='1335' 

declare @startdate date; 
set @startdate='03/01/2014' 

declare @enddate date; 
set @enddate='02/28/2015' 

declare @reportname varchar(50); 
set @reportname='%Medicaid Billable Report%' 

declare @metasectionname varchar(100); 
set @metasectionname='Medicaid Primary' 

select 
(
select count(iscoded) 
from ope.ope.vwerali 
    where iscoded=1 
     and [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
) 
/count(iscoded) 
from ope.ope.vwerali 
    where [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
+1

"Я получаю два разных номера" .. какие номера вы получаете? Counts возвращает целые числа. Не переходя к другому типу данных, и у вас есть знаменатель> ваш числитель, вы получите 0 в результате. Пример: 'select 1/2' – Dan

+1

Как сказал Дэн, но немного конкретнее ... Оберните свой знаменатель в CAST (nullif (count (iscoded), 0) как float). SQL Server обрабатывает целочисленное деление по-разному, чем обычная математика. Nullif предотвратит деление на нулевые ошибки –

+0

Вложенный оператор select возвращает 2484, а count (iscoded) возвращает 3569. Я попытался преобразовать столбцы в int, но запрос все равно возвращает ноль. – WSL346

ответ

1

Нет необходимости в двух вариантах выбора, просто используйте оператор Case для подсчета.

Также, я думаю, вы пытаетесь избежать нуля 0 в делителе.

Также для параметров даты передачи значений даты в ANSI Дата т.е. YYYYMMDD

select count(CASE WHEN iscoded=1 THEN iscoded END) * 1.00 
    /NULLIF(count(iscoded), 0) 
from ope.ope.vwerali 
    where [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
+0

К сожалению, это все равно возвращает ноль. – WSL346

+0

@ WSL346 Попробуйте сначала, когда он набрал его как int, теперь он должен возвращать десятичные числа –

+0

Я решил свою проблему, используя другой метод, но этот ответ работает так же и намного более компактен. Благодаря @ M.Ali – WSL346

0
declare @hospitalfk int; 
set @hospitalfk='1335' 

declare @startdate date; 
set @startdate='03/01/2014' 

declare @enddate date; 
set @enddate='02/28/2015' 

declare @reportname varchar(50); 
set @reportname='%Medicaid Billable Report%' 

declare @metasectionname varchar(100); 
set @metasectionname='Medicaid Primary' 

select 
(
    select CONVERT(NUMERIC(10,2),count(iscoded)) 
    from ope.ope.vwerali 
    where iscoded=1 
     and [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
) 
/CONVERT(NUMERIC(10,2),count(iscoded)) 
from ope.ope.vwerali 
    where [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
0

Я получил его возвращение ожидаемого значения, что я искал. Кредит идет к Кевину Суслицки. Все, что мне нужно сделать, это изменить:

count(iscoded) 

в

convert(float,nullif(count(iscoded),0)) 

Обновленный запрос

declare @hospitalfk int; 
set @hospitalfk='1335' 

declare @startdate date; 
set @startdate='03/01/2014' 

declare @enddate date; 
set @enddate='02/28/2015' 

declare @reportname varchar(50); 
set @reportname='%Medicaid Billable Report%' 

declare @metasectionname varchar(100); 
set @metasectionname='Medicaid Primary' 

select 
(
select convert(float,nullif(count(iscoded),0)) 
from ope.ope.vwerali 
    where iscoded=1 and [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
) 
/convert(float,nullif(count(iscoded),0)) 
from ope.ope.vwerali 
    where [email protected] 
     and reportdate between @startdate and @enddate 
     and reportname like @reportname 
     and metasectionname like @metasectionname 
Смежные вопросы