通过连接表找到聚合 - SQL SERVER

时间:2015-01-13 19:24:58

标签: sql-server join error-handling

问题:找出每个国家报告的病例中死亡人数的百分比。

数据分为两个表 - 案例和死亡。两个表中都有国家/地区列。死亡是没有的专栏。死亡表中的死亡人数。案例是报告的案例,在案例表中。

使用以下查询

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.

==

单独汇总和平均,我得到的平均值如下。 (同样在excel中)

SELECT sum(cases) FROM cases

值为106036635

SELECT sum(deaths) FROM death

值为716111

(716111/106036635)*100= 0.675343008.

两个值的差异如何!!

==

ALSO

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帮助我..

2 个答案:

答案 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个案例,则可以将查询简化为此

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

答案 1 :(得分: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