2017-02-14 61 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 

我在python黑客是分割成数的两个表,并表合并在一起,但我认为这是一个更好的办法做到这一点在SQL

+0

我删除了不兼容的数据库标签。请标记您真正使用的数据库。 –

+0

谢谢,我使用的是Postgres – cookee89

回答

4

您需要unpivot数据并做count

您可以使用UnnestArray到unpivot的数据。 Unnestarray转换为一组行

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 allgroup 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

应该是'联盟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