2010-10-12 5 views
2

J'ai une table qui enregistre l'activité. Il possède une colonne d'activité int qui indique le type d'activité et un admin_id correspondant qui indique quel administrateur a effectué l'action. Chaque ligne de la table représente une action. Par exemple, un administrateur annulerait le compte d'un utilisateur, et une ligne avec l'ID et l'activité de cet administrateur = [int représentant cancel] serait créée. Je besoin d'un moyen à sélectionner un résultat qui regroupe l'activité de chaque administrateur de telle sorte que la ligne correspondant à l'administrateur aurait le # de chaque activitéRegroupement de plusieurs comptes avec chaque ligne représentant un ID

Le résultat ressemblerait

 
admin_id | numActivated | numCanceled | numRenewed 
1   1    1    2 
2   1    3    0 

Avec numActivated, numCanceled et numRenewed proviennent tous du nombre pour chaque activité.

C'est ce que la table d'origine aurait ressemblé:

 
admin_id | activity ... 
1   2 
1   1 
1   3 
1   3 
2   2 
2   2 
2   2 
2   1 

(activité 1: activer, 2: cancel, 3: renouveler)

Merci

Répondre

3

Cela devrait faire ce que vous demandez:

select admin_id, 
     sum(case when activity = 1 then 1 else 0 end) as numActivated, 
     sum(case when activity = 2 then 1 else 0 end) as numCanceled, 
     sum(case when activity = 3 then 1 else 0 end) as numRenewed 
    from YourTable 
    group by admin_id 
+0

Fonctionne très bien, merci! – Lincecum

0

Cela devrait t:

SELECT 
    T.admin_id, 
    sum(T.activate) AS numActivated, 
    sum(T.canceled) AS numCanceled, 
    sum(T.renew) AS numRenewed 
FROM (
    SELECT 
     admin_id, 
     CASE activity WHEN 1 THEN 1 ELSE 0 END AS activate, 
     CASE activity WHEN 2 THEN 1 ELSE 0 END AS canceled, 
     CASE activity WHEN 3 THEN 1 ELSE 0 END AS renew 
    FROM Table 
) AS T 
GROUP BY T.admin_id 
+1

Pas besoin de la sous-requête; faites toujours ce que vous pouvez en un seul passage. –

Questions connexes