2009-11-26 6 views
0

J'ai une requête avec les tables suivantes (réduite pour afficher uniquement les colonnes intéressées).mysql join requête

t1 
code 

t2 
code, period, status 

t3 
period, desc 

Maintenant ce que j'ai est,

t3 est une table de "périodes" uniques.

t1 est une table de codes uniques.

t2 est la table de jointure reliant les deux ensemble, avec un statut, pour l'exemple de cet état status = (A, B, C). Ce que je fais est de créer un résultat de requête qui est groupé par "période" et a le nombre de "codes" dans chaque état.

C'est facile à résoudre, mais je veux étendre cela à, non seulement compter le nombre de codes en A, B et C, mais aussi compter les codes qui ne sont PAS associés à une période ou en d'autres termes, un décompte des codes qui ne sont pas en t2 pour une période donnée.

donc le résultat que je cherche est

Period A B C (Codes from t1 not found in t2) 
P1  10 5 2 3 
P2  5 5 5 10 

Répondre

1

Vous pouvez utiliser pour sélectionner cross rejoindre une matrice de tous les codes pour toutes les périodes. Cela vous permet de compter les lignes qui ne sont pas présentes:

select 
    sum(case when t2.status is 'A' then 1 else 0 end) as ACount, 
    sum(case when t2.status is 'B' then 1 else 0 end) as BCount, 
    ... 
    sum(case when t2.code is null then 1 else 0 end) as NotPresentCount 
from  t1 
cross join t3 
left join t2 
on   t2.code = t1.code and t2.period = t3.period 
group by t3.period 
+0

Vous voulez exactement que je l'étais après. Merci. – kaylnn