Rust weiter, SQL weiter, Massmatics begonnen
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user