Rust weiter, SQL weiter, Massmatics begonnen

This commit is contained in:
2026-09-21 21:03:01 +02:00
parent 19b153dd54
commit af3537b17b
9 changed files with 373 additions and 2 deletions
+125
View File
@@ -1392,3 +1392,128 @@ Dein Ergebnis sollte genau diese Spaltennamen haben:
```sql
select count(product_id) as total_transactions, avg(quantity) as avg_quantity, max(price_per_unit) as max_unit_price, sum(price_per_unit * quantity) as total_revenue from sales
```
## Integrierte Aggregatfunktionen Teil 2
Manchmal müssen wir Aggregatfunktionen auf komplexere Weise verwenden, etwa indem wir jede Zeile mit einem Aggregatwert vergleichen. Hier kommen verschachtelte Abfragen ins Spiel.
Wenn du Berechnungen durchführen möchtest, die einzelne Zeilen mit aggregierten Werten kombinieren, musst du eine verschachtelte Abfrage verwenden. Hier ist der Grund:
Dies liefert nicht das gewünschte Ergebnis pro Zeile:
```sql
SELECT value + MIN(value)FROM table1
```
Der Grund ist, dass Aggregatfunktionen auf der gesamten Spalte arbeiten, während der Verweis „value“ versucht, zeilenweise zu arbeiten. Um dies zu lösen, verwenden wir eine verschachtelte Abfrage:
```sql
SELECT value + (SELECT MIN(value) FROM table1)FROM table1
```
Das funktioniert, weil die verschachtelte Abfrage `(SELECT MIN(value) FROM table1)` zuerst ausgeführt wird und einen einzelnen Wert zurückgibt, der dann in der Hauptabfrage für jede Zeile verwendet werden kann.
Häufige Anwendungsfälle für verschachtelte Aggregationen:
1. Jeden Wert mit dem Durchschnitt vergleichen
2. Prozentsatz der Gesamtsumme berechnen
3. Unterschiede zu Maximal- oder Minimalwerten finden
### Challenge
Verfügbare Tabellen und Spalten:
> - `items`**:** `id`**,** `price`
| id | price |
| --- | ----- |
| 4 | 19 |
| 5 | 16 |
| 6 | 13 |
| 7 | 21 |
| 8 | 16 |
| 9 | 23 |
| 10 | 27 |
| 11 | 18 |
| 12 | 21 |
| 13 | 22 |
Berechne, um wie viel der Preis jedes Elements den Durchschnittspreis aller Elemente **übersteigt**. Zeige die ID des Elements, seinen Preis und die Differenz zum Durchschnitt an. Benenne die Differenzspalte als `diff_from_avg`.
Sortiere die Ergebnisse nach der Differenz in absteigender Reihenfolge.
```sql
select id, price, price - (select avg(price) from items) as diff_from_avg from items order by diff_from_avg desc
```
## Gruppierung Teil 1
Wir haben bisher Daten für das gesamte Feld berechnet und werden nun die Möglichkeit einführen, Daten für spezifische Gruppen zu berechnen.
---
**workers**
|id|area|age|
|---|---|---|
|1|A|35|
|2|A|37|
|3|B|29|
|4|B|39|
Wenn wir 
```sql
SELECT AVG(age) as avg_age FROM workers
```
schreiben, erhalten wir nur das Durchschnittsalter aller workers zusammen. 
Was wäre, wenn wir das Durchschnittsalter für jeden **Bereich** berechnen wollten?
Dafür können wir die `GROUP BY` Schlüsselwörter verwenden
```sql
SELECT area, AVG(age) as avg_age FROM workers GROUP BY area
```
Das Ergebnis:
|Bereich|Durchschnittsalter|
|---|---|
|A|36|
|B|34|
Jetzt wissen wir, dass das Durchschnittsalter in Bereich `A 36` und das Durchschnittsalter in Bereich `B 34` ist.
Gegeben sei eine **sales**-Tabelle mit den Spalten `region` und `amount`, wie würden Sie den Gesamtumsatz pro Region ermitteln?
SELECT region, SUM(amount) FROM sales GROUP BY region
GROUP BY region erstellt Gruppen für jede Region, und SUM berechnet die Gesamtsumme innerhalb jeder Gruppe.
Was macht `GROUP BY`?
Berechnet Aggregatwerte für jede Gruppe separat
Was würde diese Abfrage zurückgeben?
```sql
SELECT COUNT(id) FROM workers GROUP BY area
```
Die Anzahl der Arbeiter in jedem Bereich, aber ohne anzuzeigen, welcher Bereich
Die Abfrage gruppiert nach Bereich und zählt, aber da der Bereich nicht in SELECT enthalten ist, siehst du nur die Zählungen, ohne zu wissen, welchen Bereich sie repräsentieren.
### Challenge
| name | type | pH |
| ------------ | --------- | ---- |
| Celery | vegetable | 5.8 |
| Peas | vegetable | 6.5 |
| Corn | vegetable | 7 |
| Kale | vegetable | 6.4 |
| Pepper | vegetable | 5.15 |
| Cabbage | vegetable | 5.5 |
| Banana | fruit | 4.8 |
| Mango | fruit | 4.3 |
| Peaches | fruit | 3.5 |
| Apricot | fruit | 3.7 |
| Oranges | fruit | 3.6 |
| Cherries | berry | 3.7 |
| Raspberries | berry | 3.5 |
| Strawberries | berry | 3.3 |
| Blueberries | berry | 3.7 |
| Grapes | berry | 3.9 |
select type, round(avg(pH),2) as ph_average from foods group by type