Maison > Questions et réponses > le corps du texte
Merci beaucoup d'avance pour votre soutien. J'apprends SQL et je génère des données avec lesquelles jouer, mais je suis bloqué sur une chose simple. Le tableau dans la capture d'écran ci-dessous montre une partie de mon tableau sales20, qui montre les ventes réalisées par chaque employé en 2020 ainsi que les informations sur la région et la date.
Ventes de table 20
J'ai la même table de 2021. Ce que je veux faire, c'est fournir le nom de l'employé, la région et les ventes totales réalisées par l'employé en 2020 et 2021. J'ai écrit la requête suivante mais elle ne donne pas les bons chiffres. Cela apporte quelque chose de plus élevé que ce qu’il mérite. Le point important est que les salariés en 2020 et 2021 sont différents. Par exemple, il y a un nouvel employé en 2021, ce qui signifie qu'il doit également être répertorié, mais la colonne 2020 de cet employé doit être vide.
Ma requête :
SELECT sales20.staff, sales20.region, SUM(sales20.amount) AS Total_20, SUM(sales21.amount) AS Total_21 FROM sales20 JOIN sales21 ON sales20.staff = sales21.staff GROUP BY staff, region
Capture d'écran partielle des résultats :
Résultat :
Pouvez-vous me dire ce que j'ai fait de mal ?
P粉4764755512024-04-05 11:55:05
Lorsque vous devez fusionner deux tables, vous les rejoignez -
SELECT staff, region, SUM(IF(YEAR(saledate) = '2020',amount,0) AS Total_20, SUM(IF(YEAR(saledate) = '2021',amount,0) AS Total_21, FROM (SELECT staff, region, amount, saledate FROM sales20 UNION ALL SELECT staff, region, amount, saledate FROM sales21) GROUP BY staff, region;
P粉1388714852024-04-05 00:24:31
SELECT sales20.staff, sales20.region, SUM(sales20.amount) AS Total_20, SUM(sales21.amount) AS Total_21 FROM sales20 JOIN sales21 ON sales20.staff = sales21.staff AND sales20.region = sales21.region GROUP BY staff, region
Vous devez rejoindre 2 tables en fonction de la personne et de la région pour une jointure individuelle. Si vous vous inscrivez uniquement sur la base des employés, le système effectuera une adhésion un à plusieurs et vous obtiendrez une sortie corrompue.
Une autre approche consiste à fusionner les données des deux tables, puis à effectuer une agrégation sur cette base. Cela devrait vous donner des résultats précis.
WITH combined_data AS ( SELECT staff, region, saledate, amount FROM sales20 UNION ALL SELECT staff, region, saledate, amount FROM sales21 ) SELECT staff, region, SUM(CASE WHEN year(saledate) = 2020 THEN amount ELSE 0 END) AS Total_20, SUM(CASE WHEN year(saledate) = 2021 THEN amount ELSE 0 END) AS Total_21 FROM combined_data GROUP BY staff, region