2017-03-03 6 views
1

Um eine lange Geschichte kurz zu machen:SQL - Count Vorkommen der unterschiedlichen Werte in Spalte

Ich habe Tabelle wie diese

nr sat col 
1 1  dsag 
1 2  gds 
1 2  gds 
2 1  gdsa 
2 2  gf 
2 3  gdsa 

und erwarten, dass das Ergebnis wie folgt aus:

nr Sat_1 Sat_2 Sat_3 
1 1  2  0 
2 1  1  1 

Ich möchte neue Spalte für jede Zeile von "SELECT DISTINCT sat" und nächste Gruppe von nr

+1

"Lange Geschichte kurz" - Sie müssen eine 'COUNT (DISTINCT col)' mit 'GROUP BY nr, sat' verwenden, um die Zahlen zu erhalten, und ein' PIVOT', um Ihre gewünschte Anzeige zu erhalten. Um diese kurze Geschichte länger zu machen, zeigen Sie bitte, was Sie bereits versucht haben. – Siyual

Antwort

2

I a_horse_with_no_name Antwort mag. Dies ist kürzer, obwohl es etwas langsamer sein könnte:

select nr, 
     sum((sat = 1)::int) as sat_1, 
     sum((sat = 2)::int) as sat_2, 
     sum((sat = 3)::int) as sat_3 
from the_table 
group by nr 
order by nr; 

Je mehr typischer Weg, um die Abfrage zu schreiben, mit case:

select nr, 
     sum(case when sat = 1 then 1 else 0 end) as sat_1, 
     . . . 

Dies geschieht Standard-SQL zu sein, die in vielen Datenbanken laufen.

+1

Die 'filter()' -Klausel ist auch Standard-SQL;) –

+0

@a_horse_with_no_name Gibt es einen Platz mit einem Diagramm von Standard-SQL-Funktionen und welche rdbms unterstützen es? z.B. wie Sie für emca5/6 und Browser finden können? https://kangax.github.io/compat-table/es6/ – SqlZim

+2

Nicht wirklich, denke ich, weil der SQL-Standard nicht kostenlos verfügbar ist. Der einzige Vergleich, den ich im Entferntesten kenne, ist: http://www.sql-workbench.net/dbms_comparison.html, aber das ist bei weitem nicht vollständig, noch ist es auf Funktionen aus dem SQL-Standard beschränkt. –

6

Dies kann mit cond itional Aggregation:

select nr, 
     count(*) filter (where sat = 1) as sat_1, 
     count(*) filter (where sat = 2) as sat_2, 
     count(*) filter (where sat = 3) as sat_3 
from the_table 
group by nr 
order by nr; 

Online Beispiel: http://rextester.com/YVIR75756

+0

Ja, ich weiß, aber ich möchte es nicht manuell machen, weil es viel mehr Werte in der Spalte sat gibt als in diesem Beispiel. Es wäre perfekt, wenn es für jeden unterschiedlichen Wert automatisch eine "Zähllinie" erzeugt: – dekarz

+0

@dekarz: Sie hätten das in Ihrer Frage erwähnen sollen. Aber im Allgemeinen ist das nicht möglich. Die Anzahl der Spalten einer Abfrage muss der Datenbank _before_ bekannt sein, bevor sie ausgeführt wird. –

+0

Ich sehe. Danke trotzdem, es scheint die beste Antwort zu sein! :) Aber ich bin enttäuscht, dass ich es nicht so machen kann, wie ich es mir vorgestellt habe. – dekarz

Verwandte Themen