Heim > Fragen und Antworten > Hauptteil
Vielen Dank im Voraus für Ihre Unterstützung. Ich lerne SQL und generiere ein paar Daten zum Spielen, aber bei einer einfachen Sache hänge ich fest. Die Tabelle im Screenshot unten zeigt einen Teil meiner sales20-Tabelle, die die von jedem Mitarbeiter im Jahr 2020 erzielten Umsätze zusammen mit Regions- und Datumsinformationen zeigt.
Tischverkauf 20
Ich habe den gleichen Tisch aus dem Jahr 2021. Ich möchte den Namen des Mitarbeiters, die Region und den Gesamtumsatz angeben, den der Mitarbeiter in den Jahren 2020 und 2021 erzielt hat. Ich habe die folgende Abfrage geschrieben, sie liefert jedoch nicht die richtigen Zahlen. Es bringt etwas Höheres, als es verdient. Der wichtige Punkt ist, dass die Mitarbeiter in den Jahren 2020 und 2021 unterschiedlich sind. Beispielsweise gibt es im Jahr 2021 einen neuen Mitarbeiter, was bedeutet, dass er ebenfalls aufgeführt werden sollte, die Spalte 2020 für diesen Mitarbeiter jedoch leer sein sollte.
Meine Anfrage:
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
Teilweiser Screenshot der Ergebnisse:
Ergebnis:
Kannst du mir sagen, was ich falsch gemacht habe?
P粉4764755512024-04-05 11:55:05
当您需要合并两个表时,您正在连接它们 -
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
您需要根据人员和区域来连接 2 个表,以进行一对一连接。如果您仅基于员工加入,那么它会进行一对多加入,因此您将得到损坏的输出。
另一种方法是合并两个表中的数据,然后在此基础上执行聚合。这应该会为您提供准确的结果。
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