2012-07-07 15 views
14

Mam tabeli, który wygląda mniej więcej tak:SQL - liczenie wierszy o określonej wartości

id value 
1 0 
1 1 
1 2 
1 0 
1 1 
2 2 
2 1 
2 1 
2 0 
3 0 
3 2 
3 0 

teraz za każdym id chcę zliczyć liczbę wystąpień 0 i 1 oraz liczbę wystąpień dla że ID (wartość może być dowolną liczbą całkowitą), więc efekt końcowy powinien wyglądać mniej więcej tak:

id n0 n1 total 
1 2 2 5 
2 1 2 4 
3 2 0 3 

udało mi się pierwszy i ostatni wiersz z tym stwierdzeniem:

SELECT id, COUNT(*) FROM mytable GROUP BY id; 

Ale jestem trochę zagubiony. Jakieś wskazówki, jak to osiągnąć bez wielkiego oświadczenia?

Odpowiedz

26

z MySQL, można użyć SUM(condition):

SELECT id, SUM(value=0) AS n0, SUM(value=1) AS n1, COUNT(*) AS total 
FROM  mytable 
GROUP BY id 

Zobacz na sqlfiddle.

+1

Słodko, nie wiedziałem nawet, że było "SUMA (warunek)"! – ryyst

+2

@ryyst: Cóż, jest to sztuczka, która wykorzystuje fakt, że MySQL ocenia boolowskie wyniki wyrażeń warunkowych na 0, jeśli fałsz i 1 na true; więc przyjęcie "SUM" w każdej grupie daje liczbę tych rekordów, w których warunek jest prawdziwy. – eggyal

+7

Możesz też być bardziej ekspresyjny i używać 'COUNT (CASE WHEN value = 0 THEN 1 END) AS n0, ..., ...', który będzie działał we wszystkich innych głównych DBMSs, ponieważ MySQL jest jedynym, który tworzy implicite konwersje boolowskie. Zobacz moje [pytanie tutaj] (http://stackoverflow.com/questions/11340540/conditional-counting-performance-differences-in-using-sum-vs-count), aby uzyskać więcej informacji. –

0

Jak powiedział powyżej @Zane, typową metodą jest użycie wyrażeń CASE do wykonania przestawu.

Serwer SQL ma teraz operatora PIVOT, który możesz zobaczyć. DECODE() i IIF() były starszymi podejściami do Oracle i Access, które możesz nadal znaleźć w pobliżu.

Powiązane problemy