具有合并和左外部联接的SQL查询

具有合并和左外部联接的SQL查询,sql,sqlite,join,coalesce,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为铜 现在,正常的显示场景是一个国家列表,首先是max gold,然后是silver,然后是bronze。例如: swe g:2

很抱歉打扰您,但我被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为铜

现在,正常的显示场景是一个国家列表,首先是max gold,然后是silver,然后是bronze。例如:

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
到目前为止还可以。但我有另一个表“国家”,全名,简称和一些“类型”

我想将“结果”表和“国家”表合并起来,这样我就可以列出“国家”表中的所有结果,如果没有结果,那么它只是一个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”

尝试更改

LEFT OUTER JOIN results as r ON c.short = r.country 
WHERE 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

!!!!!!!这就是解决方案!!!!!事实上我不知道,在JOIN中允许执行多个操作。非常感谢。我不明白“不,它不起作用!!!它只显示一行接一行的结果!”的意思。很抱歉评论不清。例如,我在“国家”表中有5个国家:瑞典、俄罗斯、美国、挪威、斯洛文尼亚…在“结果”中只有2行:swe和rus。然后显示3行。swe、rus和usa(最早由c.name DESC发现)。“分组依据”是一个问题,我认为是“分组依据r.country”@user1908375啊,我明白了。你明白为什么这是个问题吗?你在结果表中按数据分组,你的外部联接,其中国家的所有数据,对于该表中不存在的行都是空的。因此是单行。很抱歉,我应该能够挑出它。请使用更多信息进行编辑。仅编码并“尝试此”答案是不鼓励的,因为它们不包含可搜索的内容,并且没有解释为什么有人应该“尝试这个”。
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
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;