web-dev-qa-db-fra.com

Compter le nombre d'occurrences pour chaque valeur unique

Fondamentalement, j'ai un tableau similaire à celui-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  

Quelques notes:

  • Les activités peuvent être entre 1 et 5
  • La longueur peut être comprise entre 1 et 3

La requête devrait retourner:

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

Fondamentalement, pour chaque heure unique, je veux un décompte du nombre de lignes où la valeur des activités est 3.

Alors je peux dire: 

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

Ensuite, je veux un compte pour l'activité 1, 2, 4 et 5. afin que je puisse tracer la distribution pour chaque temps unique.

31
James Elder

Oui, vous pouvez utiliser group by:

select time, activities, count(*) from table group by time, activities;
54
Jamey Sharp
select time, coalesce(count(case when activities = 3 then 1 end), 0) as count
from MyTable
group by time

Exemple SQL Fiddle

Sortie:

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

Si vous voulez compter toutes les activités dans une requête, vous pouvez faire:

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

L'avantage de ce regroupement par activités est qu'il renvoie 0, même s'il n'y a aucune activité de ce type pour ce segment temporel. 

Bien entendu, cela ne renverra pas de lignes pour les segments temporels sans activité d'aucun type. Si vous en avez besoin, vous devrez utiliser une jointure gauche avec une table répertoriant tous les segments temporels possibles.

8
RedFilter

Si je comprends votre question, cela fonctionnerait-il? (vous devrez remplacer par vos noms de colonnes et de tables actuels)

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

Vous devriez changer la requête en:

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

Cette vl fonctionne correctement.

0
geetha