2015-01-13 5 views
0

Вопрос: Найдите процент людей, умерших из случаев, зарегистрированных для каждой страны.Поиск совокупности по таблице соединений - SQL SERVER

Данные находятся в двух таблицах-случаях и смерти. В обеих таблицах есть столбцы страны. Смерть - это столбец с no. смертей в таблице смертей. И случаи - это случаи, которые указаны в таблице случаев.

С помощью следующего запроса,

SELECT (sum(isnull(d.deaths,0))/sum(isnull(c.cases,0)))*100 
FROM cases as c 
JOIN death as d ON c.country=d.country 

Im получить ответ 0.54493487236178.

==

АГРЕГИРОВАНИЕ отдельно и усреднение, я получаю в среднем, как в следующем. (То же самое в первенствует)

SELECT sum(cases) FROM cases 

Значение 106036635

SELECT sum(deaths) FROM death 

Значение 716111

(716111/106036635)*100= 0.675343008.

Каким образом оба значения отличаются !!

==

ТАКЖЕ

SELECT c.country, (sum(d.deaths)/sum(c.cases))*100 
FROM cases as c 
JOIN death as d ON c.country1=d.country1 AND c.cases IS NOT NULL AND d.deaths IS NOT NULL 
GROUP BY c.country 

дает мне Divide by zero error encountered.! Я понимаю, что мои коды довольно уродливые и давно я новичок. Plz помогите мне ..

+0

У вас есть пара вопросов здесь. Во-первых, мы не можем видеть, что происходит.Но в дивизоре вашего первого вычисления у вас есть ISNULL (xx, 0). Это означает, что если сумма случаев равна нулю, вы попытаетесь разделить на 0. Вторая проблема заключается в том, что ваши запросы для получения значений НЕ совпадают с запросом с вычислением, потому что ваш основной запрос имеет соединения, и ваш запрос проверки работоспособности не. –

+0

Действительно благодарю @SeanLange за то, что вы изучили это. Проблема в том, что если я удаляю «IS NULL», то и я получаю то же самое .54493487236178! Я поставил «IS NULL» для того, чтобы избежать «Разделить по нулевой ошибке». Теперь я не там, где я себя чувствую :( – ajufsd

+0

Эти способы, которые вы ставите, вместе не будут избегать деления на нулевую проблему здесь. Подумайте, есть ли все строки в случаях null. (У вас действительно есть таблица и столбец с тем же именем?) Если все они NULL, у вас будет ошибка деления на 0. –

ответ

0

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

Начнем с соотношений, которые вы считаете неправильными. Помните, что в вашем первоначальном запросе вы выполняете внутреннее соединение, поэтому ваши суммы кажутся неправильными. Если у вас есть случаи без смертей, вы фактически не будете считать эти случаи. ваши обратные запросы должны выглядеть

SELECT sum(cases) FROM cases where cases.country in (Select death.country from death) 

и

SELECT sum(deaths) FROM death where death.country in (Select cases.country from cases) 

Используя этот запрос должен показать вам правильное соотношение.

Для вашей второй проблемы есть вероятность, что у вас есть страны, перечисленные без каких-либо случаев. В этом случае мы хотим, чтобы добавить условный оператор, чтобы помочь определить, когда есть проблема

Select c.country, 
    Case c.cases 
     When 0 Then 
      Case d.deaths 
       When 0 Then 0 
       Else 100 
      End 
     Else (sum(d.deaths)/sum(c.cases))*100 
    End As Ratio 
From cases c 
    Inner Join death d 
     On c.country = d.country 
Where c.cases Is Not Null 
    And d.death Is Not Null 
Group By c.country 

Или, если вы хотите Disclude 0 случаев вы можете упростить запрос к этому

Select c.country, 
    (sum(d.deaths)/sum(c.cases))*100 As Ratio 
From cases c 
    Inner Join death d 
     On c.country = d.country 
Where c.cases <> 0 
    And c.cases Is Not Null 
    And d.death Is Not Null 
Group By c.country 
+0

Я думаю, вы приложили много усилий здесь @KHeaney, спасибо. Я получаю проценты, но все же, если я нахожу процент каждой страны используя excel, значения показывают разницу, чем результаты SQL. Есть ли способ поделиться этими данными с вами? – ajufsd

+0

, если вы хотите поделиться данными, лучший способ сделать это - добавить его в лист Excel OneDrive, разрешить людям с ссылкой, чтобы просмотреть его и отредактировать ссылку на ваш вопрос. Является ли это соотношением листы Excel, которое по-прежнему больше или больше отношение SQL больше сейчас? – KHeaney

0

Try это:

SELECT c.country, cast(sum(d.deaths)/(case when sum(c.cases) = 0 then 1 else sum(c.cases) end) as float) *100 
FROM cases as c 
JOIN death as d ON c.country1=d.country1 AND c.cases IS NOT NULL AND d.deaths IS NOT NULL 
GROUP BY c.country 
+0

Это не всегда приведет к правильному результату. Если по какой-то причине есть 0 случаев но 2 смерти, тогда вы бы e в результате 200%, что невозможно. – KHeaney

+0

Спасибо, что посмотрели на это @mohammed, мы почти там (мы также должны избегать нулей ..) Подобно результатам KHeaney, кроме «0». – ajufsd

+0

@ KHeaney, что для рассмотрения моего ответа. Я построил свой ответ, предполагая, что нет смерти без дела. таблица смерти будет ссылаться на таблицу случаев. – Mohammed

Смежные вопросы