2015-01-13 2 views
0

질문 : 각 국가별로보고 된 사례 중 사망 한 사람의 비율을 찾습니다.테이블 조인 - SQL SERVER로 집계 찾기

데이터는 두 가지 경우에 해당하며 사망합니다. 두 테이블 모두에 국가 열이 있습니다. 사망자는 없다. 죽음의 테이블에서 죽음. 사례는보고 된 사례이며 사례 테이블에 있습니다. 다음 쿼리와

,
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 

임 답변 0.54493487236178.

==

별도로 집계하고 평균을 받고, 나는 다음과 같은 평균을 얻고있다.

SELECT sum(cases) FROM cases 

(동일 엑셀) 값은 값이 716,111

(716111/106036635)*100= 0.675343008. 두 값이 다르다 올 방법

인 106,036,635

SELECT sum(deaths) FROM death 

있다!

==

는 또한

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)을가집니다. 즉, 사례 합계가 null 인 경우 0으로 나누려고 시도합니다. 두 번째 문제는 기본 쿼리에 조인이 포함되어 있고 온 전성 검사 쿼리가 계산을 수행하기 때문에 쿼리에서 값을 가져 오는 쿼리와 같지 않다는 것입니다 아니. –

+0

@SeanLange에게이 문제를 조사해 주셔서 감사합니다. 문제는 "IS NULL"을 제거하면 같은 것을 얻게된다는 것입니다 .54493487236178! 나는 '0으로 나누기 오류가 발생했습니다.'라는 피하기 위해 "IS NULL"을 넣었습니다. 지금 나는 내가 느끼는 곳이 아니다 : ( – ajufsd

+0

그들은 길을 함께 넣어서 제로 문제에 의한 분열을 피할 수 없을 것이다. 케이스의 모든 행이 널이면 고려해 보라. (당신은 실제로 같은 이름의 테이블과 컬럼을 가지고 있는가?) 모두 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 

있을 때 결정 또는 당신은 또한 0가지 경우를 Disclude 할 경우이

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

데이터를 공유하려면 OneDrive Excel 시트에 데이터를 추가하는 것이 가장 좋습니다. 링크를보고 질문에 대한 링크를 편집하십시오. 엑셀 시트 비율이 여전히 더 큽니까? 아니면 SQL 비율이 더 큽니까? – KHeaney

0

시도하는 쿼리를 단순화 할 수 있도록 조건문을 추가 할 것 이 :

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 사망하면 당신은 근래 것입니다 불가능한 200 %의 결과. – KHeaney

+0

@mohammed를 찾아 주셔서 감사합니다. 우리는 거의 거기에 있습니다. 우리도 0을 피해야합니다. KHeaney의 결과 (0 제외)와 비슷합니다. – ajufsd

+0

@KHeaney 내 답변을 검토했습니다. 나는 대소가없는 죽음이 없다고 가정하고 대답을 만들었습니다. 사형 집행 표는 사례의 표를 참조 할 것입니다. – Mohammed