2014-02-04 4 views
2

Извините за беспокойство, но я застрял в SQLite запросов :(SQL-запрос с COALESCE и LEFT OUTER JOIN

У меня есть таблица:

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

Попробуйте изменить

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 
+0

!! !!!! Это решение !!!!!! На самом деле я не знал, что разрешено выполнять несколько операций в рамках JOIN. Большое спасибо. – user1908375

+0

Нет, это не работает !!! Он показывает только одну строку после строк с результатами! – user1908375

+0

Я не понимаю, что «Нет, это не работает !!! Он показывает только ОДИН ряд за строками с результатами!» означает. – Gratzy

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; 
+0

Пожалуйста, отредактируйте с дополнительной информацией. Только код и «попробуйте» ответы не приветствуются, поскольку они не содержат содержимого, доступного для поиска, и не объясняют, почему кто-то должен «попробовать это». – Paritosh

+0

Теперь я должен работать – hmeftah