SQL Server: возникают проблемы с получением правильного десятичного значения после приведения - PullRequest
1 голос
/ 18 августа 2010

Я пытаюсь написать запрос, который дает мне процент (например, что-то вроде 0,885, например) путем деления 2 агрегированных чисел, которые я выбрал с помощью SUM. Но мои результаты выходят как 0.0 вместо правильного числа. Так что для справки, начиная с 2 запросов, у меня есть:

SELECT SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)
FROM SomeTable

Что дает 158. А:

SELECT SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)
FROM SomeTable

Выход 203.

Теперь, если бы я сделал именно это:

SELECT SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)/SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)
FROM SomeTable

Я бы получил 0, потому что все используется как целые числа. Итак, я попробовал это:

SELECT CAST(SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END)/SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1))
FROM SomeTable

Но мой результат - 0.0. И это, очевидно, не то, что я хотел бы. Я хотел бы получить .778

Я думаю, что мне нужно приводить числа отдельно, но я попробовал это и получил исключение арифметического переполнения. Кто-нибудь видит, что я могу делать по-другому?

Я использую SQL Server 2005. Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 18 августа 2010

что происходит, когда вы делаете

THEN 1.0 ELSE 0.0

вы также можете разыграть каждое делимое число, нет смысла разыгрывать сумму

см. Также

select 3/2 --1
select 3/2.0 --1.500000
select 3/convert(decimal(3,2),2) --1.500000

Так что это один из способов

SELECT SUM(convert(decimal(3,2),
CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END))/
SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END))

Чтобы обработать деление на 0, сделайте это

SELECT CASE SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END))
when 0 then 0 else SUM(convert(decimal(3,2),
CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END))/
SUM(convert(decimal(3,2),CASE WHEN State_ID = 14 THEN 1 ELSE 0 END)) END

См. Также здесь: Эффективная обработка SQL Server деления на ноль

0 голосов
/ 18 августа 2010

Ваше выражение выполняет целочисленное деление и затем преобразует в десятичную. Вы должны изменить выражение так, чтобы оно делило десятичное число. Установка констант в виде десятичных чисел (1,0, 0,0) или приведение по крайней мере одного целого числа в качестве десятичного числа должны избежать проблемы.

0 голосов
/ 18 августа 2010

У вас была правильная идея, вы просто не зашли достаточно далеко.

SELECT CAST(SUM(CASE WHEN Status_ID = 1 AND State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1))/CAST(SUM(CASE WHEN State_ID = 14 THEN 1 ELSE 0 END) AS DECIMAL(3,1)) 
FROM SomeTable 
...