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.
simples SELECT 'c.class_1, COUNT (*) à partir des commandes o REJOIGNEZ classifications c ON ... GROUP BY c.class_1'. ça ne marche pas? –
Malheureusement, cela n'a pas fonctionné. J'ai édité ma question ci-dessus pour vous montrer mon problème. – Apo