2017-02-14 1 views
1
in einem von zwei Reihen zu finden sind

Wenn ich mit Werten hatte einen TischWie erhalte ich eine Anzahl von einem Wert, die

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

In SQL, wie würde ich einen Grafen von jeder Mannschaft, unabhängig davon, ob Sie waren Zuhause oder Abwesend.

z.

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

Mein Hack in Python in zwei Tabellen von Zählungen aufgeteilt war, und verschmelzen die Tabellen zusammen, aber ich denke, es gibt eine viel bessere Möglichkeit, dies

+0

ich die inkompatible Datenbank-Tags entfernt. Bitte markieren Sie die Datenbank, die Sie wirklich verwenden. –

+0

danke, ich benutze postgres – cookee89

Antwort

4

Sie müssen die Daten unpivot und tun das count

Sie Unnest verwenden können und Array die Daten UNPIVOT. Unnest wandelt ein array auf einen Satz von Reihen

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

angepasst dies an meine Bedürfnisse, funktioniert perfekt http://rexttester.com/WPFT66751 – cookee89

+0

Kannst du nicht einfach 'Gruppe von Team' machen? (Clever antwort.) –

+0

@GordonLinoff - In 'postgres' können wir alias name in' group by' verwenden? –

5

In SQL in SQL zu tun, würden Sie union all verwenden und group by:

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

Vielleicht gefällt das. Zähle auf Home-Spalte, zähle auf away, Union und zähle wieder.

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

Sollte 'Union ALL' sein –

+0

Danke, du hast Recht, ich habe es geändert. Auch wenn die Antwort von Gordon viel effizienter ist. –

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 
Verwandte Themen