2012-11-05 28 views
26

Zasadniczo mam tabelę podobną do tej:liczba Liczba wystąpień dla każdej unikatowej wartości

time.....activities.....length 
13:00........3.............1 
13:15........2.............2 
13:00........3.............2 
13:30........1.............1 
13:45........2.............3 
13:15........5.............1 
13:45........1.............3 
13:15........3.............1 
13:45........3.............2 
13:45........1.............1 
13:15........3.............3 

Kilka uwag:

  • czynności mogą być między 1 a 5
  • długość może od 1 do 3

Zapytanie powinno wrócić:

time........count 
13:00.........2 
13:15.........2 
13:30.........0 
13:45.........1 

W zasadzie dla każdego unikalnego raz chcę zliczania liczby wierszy, w których wartość działania wynosi 3.

Więc mogę powiedzieć:

At 13:00 there were X amount of activity 3s. 
At 13:45 there were Y amount of activity 3s. 

Następnie chcę liczyć na działalność 1s, 2s, 4s i 5s. więc mogę wydrukować dystrybucję dla każdego unikalnego czasu.

Odpowiedz

47

Tak, można użyć group by:

select time, activities, count(*) from table group by time, activities; 
+0

Dzięki! To wydaje się najprostsze i najbardziej funkcjonalne rozwiązanie :) –

+0

@JamesElder, chętnie pomożemy! Czy rozważyłbyś zaznaczenie odpowiedzi jako "zaakceptowanej"? :-) –

3

Jeśli rozumiem Twoje pytanie, czy to działa? (Trzeba będzie zastąpić rzeczywistą nazwy kolumn i tabel)

SELECT time_col, COUNT(time_col) As Count 
FROM time_table 
GROUP BY time_col 
WHERE activity_col = 3 
+0

dzięki za pomoc! –

8
select time, coalesce(count(case when activities = 3 then 1 end), 0) as count 
from MyTable 
group by time 

SQL Fiddle Example

wyjściowa:

| TIME | COUNT | 
----------------- 
| 13:00 |  2 | 
| 13:15 |  2 | 
| 13:30 |  0 | 
| 13:45 |  1 | 

Jeśli chcesz liczyć wszystkie czynności w jednym zapytanie, możesz zrobić:

select time, 
    coalesce(count(case when activities = 1 then 1 end), 0) as count1, 
    coalesce(count(case when activities = 2 then 1 end), 0) as count2, 
    coalesce(count(case when activities = 3 then 1 end), 0) as count3, 
    coalesce(count(case when activities = 4 then 1 end), 0) as count4, 
    coalesce(count(case when activities = 5 then 1 end), 0) as count5 
from MyTable 
group by time 

Zaletą tego ponad grupowanie według działań jest to, że zwróci liczbę równą 0, nawet jeśli nie istnieją żadne działania tego typu dla tego segmentu czasowego.

Oczywiście nie spowoduje to powrotu wierszy do segmentów czasu bez żadnych działań. Jeśli tego potrzebujesz, musisz użyć lewego sprzężenia z tabelą, która zawiera wszystkie możliwe segmenty czasowe.

+0

dzięki za pomoc! –

+0

To było bardzo przydatne, ponieważ chciałem mieć wynik zliczania różnych wartości dla każdego wyniku. Dzięki! –

+0

licznik z etui to idealne rozwiązanie – dynamic

0

Należy zmienić zapytanie jako:

SELECT time_col, count (time_col) jako Hrabia OD time_table GDZIE activity_col = 3 GROUP BY time_col

To vl działa poprawnie ...

Powiązane problemy