On m'a demandé de commencer à travailler davantage avec l'analyse des données et j'ai rencontré des problèmes similaires avec les fonctions d'agrégation SQL. Voici un ensemble de données très simplifié du journal des transactions de vente et du solde de l'entrepôt:
SALES
Item Period
A 2019
A 2019
A 2018
B 2019
WAREHOUSE
Item SerialN
A 111
A 123
A 222
C 321
J'ai besoin d'exécuter la fonction SQL COUNT sur la table SALES , ce qui est assez simple:
select count(a.Item), a.Item from SALES a
where a.period = 2019
group by a.Item
Je dois également ajouter le NOMBRE d'éléments dans la table WAREHOUSE - également très simple en soi, mais pas tellement en essayant de les combiner en un résultat de requête.
select count(a.Item), a.Item, count(b.Item) from SALES a
left join WAREHOUSE b on a.Item = b.Item
where a.period = 2019
group by a.Item
Celui ci-dessus gâcherait le résultat en raison de l'effet multiplicateur JOIN de la table WAREHOUSE. Quelle serait la meilleure façon d'atteindre le résultat ci-dessous? Y a-t-il un moyen efficace de faire cela?
Item count_period current_warehouse
A 2 3
B 1
Vous devez d'abord regrouper et filtrer les données de la première table, puis les joindre à la deuxième table. Comme ça:
select A.item, A.count_period, count(W.item) current_warehouse
from (select S.item, max(S.Period) Period, count(S.Period) count_period
from SALES S
where S.Period = 2019
group by S.item) A
left join WAREHOUSE W on A.Item = W.Item
group by A.item, A.count_period;
Une autre façon est:
select A.item, A.count_period, B.current_warehouse from
(select S.item, max(S.Period) Period, count(S.Period) count_period
from SALES S
where S.Period = 2019
group by S.item) A
left join
(select W.item, count(W.item) current_warehouse
from WAREHOUSE W
group by W.item) B
on A.item = B.item
ou
select A.item, max(A.count_period), count(W.item) current_warehouse
from (select S.item, max(S.Period) Period, count(S.Period) count_period
from SALES S
where S.Period = 2019
group by S.item) A
left join WAREHOUSE W on A.Item = W.Item
group by A.item;
Ici, vous avez une DEMO où vous pouvez voir que les trois renvoient les mêmes données.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots