agrégation

2025-09-17 19:06:10 +02:00
parent fb9b62323f
commit 148564a811
2 changed files with 91 additions and 22 deletions

@@ -1,11 +1,11 @@
# Fonctions d'agrégation # Fonctions d'agrégation
> [!NOTE] > [!NOTE]
> Une agrégation est une opération qui permet de combiner plusieurs valeurs de données en une seule valeur résumée. Les opérations d'agrégation sont souvent utilisées en combinaison avec la clause `group by` pour regrouper les données selon des critères spécifiques avant de les résumer. > Une agrégation est une opération qui permet de combiner **plusieurs valeurs de données en une seule valeur** résumée. Les opérations d'agrégation sont souvent utilisées en combinaison avec la clause `group by` pour regrouper les données selon des critères spécifiques avant de les résumer.
### Compter ## Compter
Compte le nombre d'enregistrements dans un ensemble de données. L'opérateur `count` Compte le nombre d'enregistrements dans un ensemble de données.
**Exercice :** Compter le nombre d'adhérents. **Exercice :** Compter le nombre d'adhérents.
@@ -16,6 +16,16 @@ select count(*) from adherent
On peut compter sur n'importe quelle colonne, dans ce cas, pour ne pas avoir à choisir on utilise le caractère joker *. On peut compter sur n'importe quelle colonne, dans ce cas, pour ne pas avoir à choisir on utilise le caractère joker *.
> [!WARNING]
> Attention ! Si on compte sur une colonne seules les lignes avec une valeur **non nulle** seront comptées.
**Exercice :** Compter le nombre d'adhérent dont le codepostal est non null.
```sql
select count(codepostal) from adherent;
>> 2438
```
**Exercice :** Compter le nombre d'articles de la famille 02CHOU. **Exercice :** Compter le nombre d'articles de la famille 02CHOU.
```sql ```sql
@@ -24,7 +34,7 @@ select count(*) from article
>> 29 >> 29
``` ```
### distinct ## distinct
En ajoutant le mot clé `distinct` l'opération s'effectue sur les **valeurs uniques** d'une ou de plusieurs colonnes.select codepostal, En ajoutant le mot clé `distinct` l'opération s'effectue sur les **valeurs uniques** d'une ou de plusieurs colonnes.select codepostal,
count(case when genre = 1 then 1 end) as nb_hommes, count(case when genre = 1 then 1 end) as nb_hommes,
@@ -39,19 +49,17 @@ select count(distinct codepostal) from adherent
>> 11 >> 11
``` ```
Attention ! Sans distinct `count(codepostal)` compte **toutes** les lignes de la colonne codepostal, soit le nombre total d'ahérent. > [!WARNING]
> Attention ! Sans distinct, `count(codepostal)` compte **toutes** les lignes de la colonne codepostal dont la valeur est non nulle. Dans notre cas pratiquement tous les adhérents (2438/2439).
```sql
select count(codepostal) from adherent
>> 2439
```
### Regroupement ### Regroupement
la clause `group by` permet de choisir un ou plusieurs niveau de regroupement. la clause `group by` permet de choisir un ou plusieurs niveau de regroupement.
```sql ```sql
select codepostal, count(*) from adherent group by codepostal; select codepostal, count(*)
from adherent
group by codepostal;
``` ```
codepostal | count codepostal | count
@@ -74,7 +82,8 @@ Il est possible de donner un nom spécifique à n'importe qu'elle colonne y comp
```sql ```sql
select codepostal, count(*) as nb_adherents select codepostal, count(*) as nb_adherents
from adherent group by codepostal; from adherent
group by codepostal;
``` ```
### Filtre ### Filtre
@@ -134,7 +143,7 @@ from adherent
group by codepostal; group by codepostal;
``` ```
### Somme ## Somme
Calcule la somme des valeurs d'une colonne numérique. Calcule la somme des valeurs d'une colonne numérique.
@@ -154,7 +163,7 @@ select sum(round(quantite * prix_unitaire, 2)) as chiffre_affaire from ligne;
L'arrondi de la somme n'est pas égal à la somme des arrondis. L'arrondi de la somme n'est pas égal à la somme des arrondis.
### Moyenne ## Moyenne
Calcule la moyenne des valeurs d'une colonne numérique. Calcule la moyenne des valeurs d'une colonne numérique.
@@ -162,7 +171,7 @@ Calcule la moyenne des valeurs d'une colonne numérique.
select avg(prix) from article; select avg(prix) from article;
``` ```
### Maximum ## Maximum
Retourne la valeur maximale dans une colonne. Retourne la valeur maximale dans une colonne.
@@ -180,7 +189,7 @@ order by prix desc limit 1;
>> Pistache 63 >> Pistache 63
``` ```
### Minimum ## Minimum
Retourne la valeur minimale dans une colonne. Retourne la valeur minimale dans une colonne.
@@ -199,16 +208,68 @@ order by prix asc limit 1;
### Une valeur ### Une valeur
Avec la fonction `any_value` la colonne prend une valeur sans aucune distinction. Avec la fonction `any_value` la colonne prend une valeur de la colonne sans distinction particulière.
```sql
select codepostal, any_value(nom)
from adherent
group by codepostal;
```
codepostal | nom
---|---
88480|Fievet
88490|Maury
88100|Cuvelier
88470|Maurin
|Jouve
88210|Aubertin
88650|Wagner
88580|Beaulieu
88430|Baudouin
88520|Bérard
88110|Frémont
88420|Besnard
### Toutes ### Toutes
La fonction `bool_and` ou son alias `every` renvoie vrai si toutes les lignes satisfont la condition. La fonction `bool_and` ou son alias `every` renvoie vrai si toutes les lignes satisfont la condition.
**Exercice :** Afficher vrai si tous les articles d'une même famille ont tous leur prix supérieur à 10 €
```sql
select famille_code, bool_and(prix > 10) as sup_10
from article
group by famille_code
```
famille_code | sup_10
---|---
03BANA | false
03PECHE|false
03RHUBARBE|false
03FIGUE|true
03ORANGE|false
### Au moins un ### Au moins un
La fonction `bool_or` renvoie vrai si au moins une lignes satisfait la condition. La fonction `bool_or` renvoie vrai si au moins une lignes satisfait la condition.
**Exercice :** Afficher vrai si au moins un article d'une famille a un prix supérieur à 5 €
```sql
select famille_code, bool_or(prix > 5) as sup_5
from article
group by famille_code
```
famille_code | sup_5
---|---
03BANA | false
03PECHE|true
03RHUBARBE|true
03FIGUE|true
03ORANGE|false
### Concaténation en chaine ### Concaténation en chaine
@@ -217,12 +278,19 @@ La fonction `bool_or` renvoie vrai si au moins une lignes satisfait la condition
```sql ```sql
select string_agg(distinct famille_code, ', ') select string_agg(distinct famille_code, ', ')
from article; from article;
>> '02, 02AROM, 02ARTICHAU, 02ASP, 02AUBE, 02BETT, ...'
``` ```
### Concaténation en tableau ### Concaténation en tableau
`ARRAY_AGG` construit une tableau à partir des éléments. Très utilisé lors d'une sérialisation en JSON par exemple. `ARRAY_AGG` construit une tableau à partir des éléments. Très utilisé lors d'une sérialisation en JSON par exemple.
```sql
select array_agg(distinct famille_code)
from article;
>> ['02', '02AROM', '02ARTICHAU', '02ASP', '02AUBE', '02BETT', ...]
```
### Filtre après agrégation ### Filtre après agrégation
`HAVING` est emblable à `WHERE`, mais utilisé pour filtrer les résultats des fonctions d'agrégation **après** un `GROUP BY`. `HAVING` est emblable à `WHERE`, mais utilisé pour filtrer les résultats des fonctions d'agrégation **après** un `GROUP BY`.

11
tp1.md

@@ -1,14 +1,15 @@
# Travaux pratiques de Cartographie # Travaux pratiques de Cartographie
1. Avec le logiciel QGIS ## 1. Logiciel de catographie
Installer QGIS
Ajouter les couches Ajouter les couches
- AJouter une couche xyz avec OpenStreetMap - AJouter une couche xyz avec OpenStreetMap
- Zommer sur l'ile de Batz (En Bretagne, au nord de Morlaix) - Zommer sur l'ile de Batz (En Bretagne, au nord de Morlaix)
### POI (Point of Interest) ## 2 POI (Point of Interest)
- Ajouter une nouvelle table pour les points - Ajouter une nouvelle table pour les points
- Ajouter un point depuis QGIS : menhir de Kreach ar Bolloch (A) un autre sur le menhir de Porz ar Roc'h - Ajouter un point depuis QGIS : menhir de Kreach ar Bolloch (A) un autre sur le menhir de Porz ar Roc'h
- Calculer la distance entre les 2 menhirs - Calculer la distance entre les 2 menhirs
@@ -23,7 +24,7 @@ create table point (
); );
``` ```
2. Créer une table zone 3. Créer une table zone
```sql ```sql
create table zone ( create table zone (
@@ -56,8 +57,8 @@ create table zone (
### La Pinède ### La Pinède
- Dessiner la pinède ouest en faisant 3 parties (utiliser le magnétisme) - Dessiner la pinède ouest en faisant 3 parties (utiliser le magnétisme)
- Vérifier que les 3 parties sont adjacentes - Vérifier que les 3 parties sont adjacentes
- Fusionner les 3 parties - Fusionner les 3 parties (ST_UNION)
- Retirer le marais de la pinède -
### Carte ### Carte
- Importer les données du fichier zone.csv - Importer les données du fichier zone.csv