使用COALESCE和LEFT OUTER JOIN的SQL查询

时间:2014-02-04 11:39:16

标签: sql sqlite join coalesce

很抱歉打扰你,但我陷入了sqlite查询:(

我有一张桌子:

sport country place type
ski  swe 1 1
ski  nor 2 1
ski  rus 3 1
luge swe 1 1
luge usa 2 1
luge ger 3 1
bob  nor 1 1
bob  rus 2 1
bob  ger 3 1

其中黄金为1,白银为2,青铜为3

现在正常显示的情景是国家列表,第一个是最大金币,然后是银色,然后是铜牌。对于那个例子,它将是:

swe g:2 s:0 b:0 sum:2
rus g:0 s:1 b:1 sum:2
usa g:0 s:1 b:0 sum:1
nor g:0 s:0 b:2 sum:2

这样做我正在做:

select
    country,
    sum(case when place = 1 then 1 else 0 end) as gold,
    sum(case when place = 2 then 1 else 0 end) as silver,
    sum(case when place = 3 then 1 else 0 end) as bronce,
    count(*) as allmedals
from 
    results 
group by 
    country 
order by 
    gold DESC, silver DESC, bronce DESC

到目前为止这是有效的。但我有另一张桌子“国家”,全名,短名和一些“类型”。

[name] [short]
usa      USA  
germany  GER  
russia   RUS  
norway   NOR  
poland   POL  

我想将表格“结果”和“国家/地区”结合起来,这样我就可以从“国家/地区”表中找到所有这些表,如果没有结果,那么它只是一个0.所以我尝试了:

SELECT 
    c.name as c_name,
    COALESCE(sum(case when r.place = 1 then 1 else 0 end), 0) as gold,
    COALESCE(sum(case when r.place = 2 then 1 else 0 end), 0) as silver,
    COALESCE(sum(case when r.place = 3 then 1 else 0 end), 0) as bronce
FROM 
    countries AS c 
LEFT OUTER JOIN 
    results AS r ON c.short = r.country 
WHERE 
    r.type = 1 
GROUP BY 
    r.country
ORDER BY 
    gold DESC, silver DESC, bronce DESC, c.name DESC" 

但问题是,我只看到一个国家列表,表格中有一行“结果”。我认为这是因为“r.type = 1”

2 个答案:

答案 0 :(得分:2)

尝试更改

LEFT OUTER JOIN results as r ON c.short = r.country 
WHERE r.type = 1

LEFT OUTER JOIN results as r ON c.short = r.country and r.type = 1

这对我很有用

select 
c.name,
sum(case when place = 1 then 1 else 0 end) as gold,
sum(case when place = 2 then 1 else 0 end) as silver,
sum(case when place = 3 then 1 else 0 end) as bronce,
count(*) as allmedals
from countries  c 
left outer join results r on c.short = r.country
group by c.name
order by gold desc, silver desc, broncedesc, c.name desc

答案 1 :(得分:0)

SELECT 
     c.name,
     SUM(CASE WHEN place = 1 THEN 1 ELSE 0 END) AS gold,
     sum(CASE WHEN place = 2 THEN 1 ELSE 0 END) AS silver,
     sum(CASE WHEN place = 3 THEN 1 ELSE 0 END) AS bronce,
     IFNULL (COUNT(r.country), 0) AS allmedals
FROM countries  c 
   LEFT OUTER JOIN records AS r ON c.short = r.country 
GROUP BY c.name
ORDER BY c.name asc;
相关问题