很抱歉打扰你,但我陷入了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”
答案 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;