2017-10-13 12 views
1

J'ai 2 tables.Sélectionner/grouper par plusieurs colonnes mais compter seulement les valeurs d'une colonne

Tableau n ° 1: Les commandes

order_id | crit_1 | crit_2 | crit_3  | other 
01  | A00 | GER | 49er  | x  
02  | A00 | GER | 49er  | x  
03  | A00 | USA | 49er  | x  
04  | C80 | DEN | 66er  | x  
05  | B50 | GER | 99er  | x  

Le tableau orders a 3 critères importants, mais n'a pas le criterion_4. Il y a une autre table avec le order_positions qui contient plusieurs entrées criterion_4 pour chaque order_id.

Tableau 2: classifications

crit_1 | crit_2 | crit_3 | crit_4 | class_1 | class_2 
A00 | GER | 49er | 4711 | A  | 11 
A00 | GER | 49er | 4712 | A  | 21 
A00 | USA | 49er | 4711 | D  | 12 
A00 | USA | 49er | 4712 | D  | 21 
B50 | GER | 99er | 4801 | B  | 12 
B50 | GER | 99er | 4802 | B  | 12 
B50 | GER | 99er | 4803 | B  | 14 
C80 | DEN | 66er | 4904 | C  | 22 
C80 | DEN | 66er | 4905 | C  | 21 

Le tableau classifications contient des classifications pour:

  • orders = class_1 = combination of crit_1, crit_2 & crit_3
  • order_positions = class_2 = combination of crit_1, crit_2, crit_3 & crit_4

J'ai une requête où je faire partie classifications.class_1 sur la ta orders pour créer une liste de tous les orders et leurs classification respectifs.

select 
orders.order_id, 
orders.crit_1, 
orders.crit_2, 
orders.crit_3, 
classifications.class_1 

from 
orders 

left join 
classifications 
on 
orders.crit_1=classifications.crit_1 and 
orders.crit_2=classifications.crit_2 and 
orders.crit_3=classifications.crit_3 

where 
orders.others = "..." 

group by 
orders.order_id, 
orders.crit_1, 
orders.crit_2, 
orders.crit_3, 
classifications.class_1 

je besoin d'un GROUP BY à la fin puisque les classifications de table contient plusieurs entrées avec la combinaison de crit_1, crit_2 et crit_3. Mais ce n'est pas un problème puisque le classification_1 nécessaire est toujours le même pour chaque combinaison de crit_1, crit_2 et crit_3.

Maintenant, je veux créer une autre requête où je compte seulement le nombre de chacun classification_1 pour les commandes. Quelque chose comme ceci:

class_1 | number 
A  | 12 
B  | 5 
C  | 18 
.  | . 

Mais je ne sais pas comment, sans toute la sélection de orders.order_id, orders.crit_1, orders.crit_2, orders.crit_3 et classifications.class_1

Je veux juste compter les class_1 classifications pour la requête ci-dessus .

Des suggestions?


modifier

Je l'ai essayé comme suggéré par Kaushik Nayak:

select 
--orders.order_id, 
--orders.crit_1, 
--orders.crit_2, 
--orders.crit_3, 
classifications.class_1, 
count(*) 

from 
orders 

left join 
classifications 
on 
orders.crit_1=classifications.crit_1 and 
orders.crit_2=classifications.crit_2 and 
orders.crit_3=classifications.crit_3 

where 
orders.others = "..." 

group by 
--orders.order_id, 
--orders.crit_1, 
--orders.crit_2, 
--orders.crit_3, 
classifications.class_1 

Mais les résultats ne sont pas corrects et je ne sais pas comment reproduire ces chiffres.

Quelques exemples:

| class_1 | query w/ | query w/o | query | 
|   | group by | group by | count(*) | 
--------------------------------------------- 
| A  | 654  | 2179  | 1024  | 
| B  | 371  | 1940  | 667  | 
| C  | 94  | 238  | 247  | 

Lorsque j'utilise ma requête avec group by puis-je obtenir 654 entrées pour class_1 = A. Lorsque je fais ma requête sans group by je reçois 2179 entrées pour class_1 = A. Et quand j'essaie la requête avec Count(*) alors je reçois 1024 entrées pour class_1 = A.

Le dernier n'est définitivement pas correct.

+0

simples SELECT 'c.class_1, COUNT (*) à partir des commandes o REJOIGNEZ classifications c ON ... GROUP BY c.class_1'. ça ne marche pas? –

+0

Malheureusement, cela n'a pas fonctionné. J'ai édité ma question ci-dessus pour vous montrer mon problème. – Apo

Répondre

0

Utilisez simplement GROUP BY class_1 pour votre table classifications et ajoutez une condition EXISTS pour vérifier s'il y a une commande.

SELECT 
    c.class_1, 
    COUNT(c.class_1) "number" 
FROM 
    classifications c 
WHERE 
    EXISTS (
     SELECT 
      1 
     FROM 
      orders o 
     WHERE 
      o.crit_1 = c.crit_1 
      AND o.crit_2 = c.crit_2 
      AND o.crit_3 = c.crit_3 
    ) 
GROUP BY 
    c.class_1 
ORDER BY 
    1;