Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m290_guko:learningunits:lu10:theorie:b_group_by [2025/11/09 18:10] gkochmodul:m290_guko:learningunits:lu10:theorie:b_group_by [2025/11/09 22:28] (aktuell) gkoch
Zeile 1: Zeile 1:
-===== LU10b: Gruppieren mit GROUP BY – Kennzahlen pro Kategorie =====+====== LU10b: Gruppieren mit GROUP BY – Kennzahlen pro Kategorie ======
  
 {{ :modul:m290_guko:learningunits:lu10:theorie:group_by-sum.webp?900 |}} {{ :modul:m290_guko:learningunits:lu10:theorie:group_by-sum.webp?900 |}}
Zeile 9: Zeile 9:
 </WRAP> </WRAP>
  
-=== 1. Regeln bei Abfragen mit Aggregatfunktionen ===+===== 1. Regeln bei Abfragen mit Aggregatfunktionen =====
 <WRAP round 80% box center> <WRAP round 80% box center>
   * In ''SELECT'' dürfen neben Aggregaten **nur** Spalten stehen, die auch im ''GROUP BY'' vorkommen.     * In ''SELECT'' dürfen neben Aggregaten **nur** Spalten stehen, die auch im ''GROUP BY'' vorkommen.  
Zeile 15: Zeile 15:
 </WRAP> </WRAP>
  
-=== 2. Beispiel: Wie viele Missionen pro Firma (Top 10)? ===+<WRAP alert center round 70%> 
 +**Typischer Fehler:**   
 +<code sql> 
 +SELECT gemeindename, SUM(straftaten_total) 
 +FROM einbrueche;  -- ❌ fehlendes GROUP BY → Fehler/Zufallswerte 
 +</code> 
 +Immer **alle nicht aggregierten Spalten** ins ''GROUP BY'' aufnehmen. 
 +</WRAP> 
 + 
 +===== 2. Beispiel: Wie viele Missionen pro Firma (Top 10)? =====
 <WRAP round 80% box center> <WRAP round 80% box center>
 <code sql> <code sql>
Zeile 29: Zeile 38:
 </WRAP> </WRAP>
  
-=== 3. Beispiel: Total Einbrüche pro Jahr (Kanton ZH) ===+===== 3. Beispiel: Total Einbrüche pro Jahr (Kanton ZH) =====
 <WRAP round 80% box center> <WRAP round 80% box center>
 <code sql> <code sql>
Zeile 40: Zeile 49:
 **Was passiert?** ''SUM(...)'' aggregiert pro Jahr (''GROUP BY ausgangsjahr''); ''ORDER BY ... DESC'' sortiert chronologisch absteigend. ''LIMIT 5'' -> max 5 Ergebnisse. **Was passiert?** ''SUM(...)'' aggregiert pro Jahr (''GROUP BY ausgangsjahr''); ''ORDER BY ... DESC'' sortiert chronologisch absteigend. ''LIMIT 5'' -> max 5 Ergebnisse.
 {{:modul:m290_guko:learningunits:lu10:theorie:einbrueche_zh.png?nolink&300|}} {{:modul:m290_guko:learningunits:lu10:theorie:einbrueche_zh.png?nolink&300|}}
-//Während den COVID-19-Jahren ging die Zahl der Einbrüche im Kanton Zürich zurück – jetzt steigt sie wieder an.//+//Während den Pandemie-Jahren ging die Zahl der Einbrüche im Kanton Zürich zurück – jetzt steigt sie wieder an.//
 </WRAP> </WRAP>
  
-=== 3.4 Beispiel: Total pro Jahr **und** Tatbestand === 
-<WRAP round 80% box center> 
-<code sql> 
-SELECT ausgangsjahr, 
-       tatbestand, 
-       SUM(straftaten_total) AS total_faelle 
-FROM zh_einbrueche.einbrueche 
-GROUP BY ausgangsjahr, tatbestand 
-ORDER BY ausgangsjahr, tatbestand; 
-</code> 
-**Was passiert?** Mehrspaltiges ''GROUP BY'' → Kennzahlen pro (Jahr × Tatbestand). 
-</WRAP> 
- 
-<WRAP alert center round 70%> 
-**Typischer Fehler:**   
-<code sql> 
-SELECT gemeindename, SUM(straftaten_total) 
-FROM zh_einbrueche.einbrueche;  -- ❌ fehlendes GROUP BY → Fehler/Zufallswerte 
-</code> 
-Immer **alle nicht aggregierten Spalten** ins ''GROUP BY'' aufnehmen. 
-</WRAP> 
- 
----- 
  
 ===== 4. HAVING – Gruppen nach Kennzahlen filtern ===== ===== 4. HAVING – Gruppen nach Kennzahlen filtern =====
Zeile 75: Zeile 61:
 </WRAP> </WRAP>
  
-=== 4.2 Beispiel: Firmen mit **mehr als 100** Missionen (Top 5) === 
-<WRAP round 80% box center> 
-<code sql> 
-SELECT company, 
-       COUNT(*) AS starts 
-FROM spacemission.missions 
-GROUP BY company 
-HAVING COUNT(*) > 100 
-ORDER BY starts DESC 
-LIMIT 5; 
-</code> 
-**Was passiert?** Erst **gruppieren**, dann **Gruppen** mit ''COUNT > 100'' **behalten**. 
-</WRAP> 
  
-=== 4.Beispiel: Jahre mit über **25'000** Einbruch-Fällen (ZH) ===+=== 4.Beispiel: Jahre mit über 25'000 Einbruch-Fällen (ZH) ===
 <WRAP round 80% box center> <WRAP round 80% box center>
 <code sql> <code sql>
-SELECT ausgangsjahr, +SELECT ausgangsjahr, SUM(straftaten_total) AS total_faelle 
-       SUM(straftaten_total) AS total_faelle +FROM einbrueche
-FROM zh_einbrueche.einbrueche+
 GROUP BY ausgangsjahr GROUP BY ausgangsjahr
 HAVING SUM(straftaten_total) > 25000 HAVING SUM(straftaten_total) > 25000
Zeile 100: Zeile 72:
 </code> </code>
 **Was passiert?** ''HAVING'' filtert nur jene **Jahre**, deren Summe über dem Schwellwert liegt. **Was passiert?** ''HAVING'' filtert nur jene **Jahre**, deren Summe über dem Schwellwert liegt.
 +{{:modul:m290_guko:learningunits:lu10:theorie:total_faelle_having.png?nolink&300|}}
 </WRAP> </WRAP>
  
----- 
- 
-===== 5. Live-Beispiele im Unterricht (wie angekündigt) ===== 
- 
-<WRAP round 80% box center> 
-**COUNT** – Missionen gesamt bis 2022   
-<code sql> 
-SELECT COUNT(*)  
-FROM spacemission.missions 
-WHERE YEAR(launch_date) <= 2022; 
-</code> 
- 
-**SUM** – Views aller 100 YouTube-Songs   
-<code sql> 
-SELECT SUM(view_count) 
-FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025; 
-</code> 
- 
-**AVG** – Durchschnittliche Songdauer   
-<code sql> 
-SELECT AVG(duration) 
-FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025; 
-</code> 
- 
-**MAX/MIN** – Längster / Kürzester Song   
-<code sql> 
-SELECT MAX(duration) FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025; 
-SELECT MIN(duration) FROM youtube_top_100_songs_2025.youtube_top_100_songs_2025; 
-</code> 
- 
-**GROUP BY** – Wie viele Missionen pro Firma   
-<code sql> 
-SELECT company, COUNT(*) AS starts 
-FROM spacemission.missions 
-GROUP BY company 
-ORDER BY starts DESC 
-LIMIT 10; 
-</code> 
- 
-**HAVING** – Firmen mit über 100 Missionen (Top 5)   
-<code sql> 
-SELECT company, COUNT(*) AS starts 
-FROM spacemission.missions 
-GROUP BY company 
-HAVING COUNT(*) > 100 
-ORDER BY starts DESC 
-LIMIT 5; 
-</code> 
-</WRAP> 
- 
----- 
- 
-===== 6. Tipps & Best Practices ===== 
- 
-<WRAP tip center round 70%> 
-**Aliasse**   
-*Spalten:* ''SELECT SUM(x) AS total'' → ''AS'' ist optional (''SELECT SUM(x) total'').   
-*Tabellen:* ''FROM t AS x'' oder ''FROM t x'' (in MySQL beides ok).   
-Wenn Sie einer Tabelle einen Alias geben, **verwenden Sie ihn konsequent** (''x.col'' statt ''t.col''). 
-</WRAP> 
  
 <WRAP tip center round 70%> <WRAP tip center round 70%>
Zeile 169: Zeile 82:
 </WRAP> </WRAP>
  
-<WRAP tip center round 70%> 
-**NULL-Fallen**   
-''COUNT(spalte)'' ignoriert NULL → bewusste Spaltenwahl!   
-Bei Quoten/Prozenten Division durch 0 vermeiden: ''NULLIF(denominator, 0)''. 
-</WRAP> 
  
-<WRAP info center round 70%> 
-**Weiterführend / Struktur in mehrere Seiten**   
-Für grössere Lernpakete empfiehlt sich eine Aufteilung:   
-• **LU10/Teil A:** Aggregatfunktionen Basics (COUNT, SUM, AVG, MIN/MAX)   
-• **LU10/Teil B:** GROUP BY – ein- und mehrspaltig, Sortierung, DISTINCT vs. GROUP BY   
-• **LU10/Teil C:** HAVING – Gruppen filtern, typische Muster   
-• **LU10/Teil D:** Performance & Indizes, Best Practices, kleine Mini-Projekte 
-</WRAP> 
  
 === Infos zu den Firmen involviert in die "Space Race" === === Infos zu den Firmen involviert in die "Space Race" ===
 +<WRAP box center round 80%>
 ^ Kürzel in Liste ^ Ausgeschrieben / Organisation ^ Land / Region ^ ^ Kürzel in Liste ^ Ausgeschrieben / Organisation ^ Land / Region ^
 | **RVSN USSR** | Strategic Missile Forces of the USSR (Raketentruppen der strategischen Bestimmung) | **Sowjetunion** (historisch) | | **RVSN USSR** | Strategic Missile Forces of the USSR (Raketentruppen der strategischen Bestimmung) | **Sowjetunion** (historisch) |
Zeile 197: Zeile 98:
 | **Boeing** | The Boeing Company (Boeing Launch Services / Delta-Programm) | **USA** | | **Boeing** | The Boeing Company (Boeing Launch Services / Delta-Programm) | **USA** |
  
 +</WRAP>
  
  • modul/m290_guko/learningunits/lu10/theorie/b_group_by.1762708203.txt.gz
  • Zuletzt geändert: 2025/11/09 18:10
  • von gkoch