2017-02-14 7 views
1

Если бы я имел таблицу со значениямиКак получить счетчик значение, которое может быть найдено в одном из двух рядов

Game Id | Home  | Away | 
------- | -------- |------- | 
0  | Team A | Team B | 
1  | Team C | Team D | 
2  | Team B | Team C | 
3  | Team D | Team C | 

В SQL, как бы я получить количество каждой команды, независимо от того, они были дома или в гостях.

E.g.

Team | Count 
    ------- | ----- 
    Team A | 1 
    Team B | 2 
    Team C | 3 
    Team D | 2 

Мой хак в питон был разделен на две таблицы подсчетов и объединять таблицы вместе, но я думаю, что есть гораздо лучший способ сделать это в SQL

+0

Я удалил несовместимые теги базы данных. Пожалуйста, пометьте базу данных, которую вы действительно используете. –

+0

спасибо, я использую postgres – cookee89

ответ

4

Вы должны unpivot данные и сделать count

Вы можете использовать Unnest и Array для UNPIVOT данных. Unnest преобразует array к набору строк

SELECT unnest(array["Home", "Away"]) AS team, 
     count(1) 
FROM  yourtable 
GROUP BY team 
+0

адаптировал это для моих нужд, отлично работает http://rextester.com/WPFT66751 – cookee89

+0

Разве вы не можете просто «по команде»? (Умный ответ.) –

+0

@GordonLinoff - В 'postgres' мы можем использовать псевдоним в' group by'? –

5

В SQL, можно использовать union all и group by:

select team, count(*) 
from ((select home as team from t) union all 
     (select away from t) 
    ) t 
group by team; 
0

Может быть, так. Подсчитайте на колонке Home, рассчитывайте на, союз и счет снова.

SELECT Team, 
     sum(occurrence) AS count 
FROM 
    (SELECT Home AS Team, 
      count(*) AS occurrence 
    GROUP BY Home 
    UNION ALL SELECT Away AS Team, 
        count(*) AS occurrence 
    GROUP BY Away) AS lookup 
+1

Должно быть 'Union ALL' –

+0

Спасибо, вы правы, я изменил его. Хотя ответ Гордона более эффективен. –

0

Grouping Sets:

with t (game_id, home, away) as (values 
    (0,'Team A','Team B'), 
    (1,'Team C','Team D'), 
    (2,'Team B','Team C'), 
    (3,'Team D','Team C') 
) 
select coalesce(home, away) as team, sum(total) as total 
from (
    select home, away, count(*) as total 
    from t 
    group by grouping sets (home, away) 
) s 
group by 1 
order by 1 
; 
    team | total 
--------+------- 
Team A |  1 
Team B |  2 
Team C |  3 
Team D |  2