De l'Importation des Données à l'Analyse Croisée
L'importation est la première étape. Voici les erreurs classiques et leurs solutions.
La base de données rejette les nombres avec des virgules (ex: 25,81
).
Solution : SQL attend un point comme séparateur. Il faut faire un "Rechercher/Remplacer" dans votre tableur (,
par .
) avant l'import.
Erreur de "valeur maximale de la séquence atteinte (32767)".
Solution : Le type de la colonne ID est trop petit (int2
). Il faut le changer pour un type plus grand comme int4
ou int8
dans la structure de la table pour accepter plus de 32,767 lignes.
Les dates sont importées comme du texte (23/11/2024
) car SQL attend le formatYYYY-MM-DD
.
Solution : Importer en tant que texte, puis convertir. Voir section suivante.
Une fois les données importées, il faut souvent les corriger. C'est l'étape de nettoyage.
On utilise la fonction to_date()
qui est un traducteur. On lui donne le texte et on lui explique comment le lire avec un "masque".
-- Met à jour la colonne 'adr2_formatted' en convertissant le texte de 'adr2'
-- Le masque 'DD/MM/YYYY' explique que le texte est au format Jour/Mois/Année
UPDATE mercalys
SET adr2_formatted = to_date(adr2, 'DD/MM/YYYY');
Erreur "column 'ADR2' does not exist".
Logique : SQL est sensible à la casse pour les noms de colonnes qui n'ont pas été créés en minuscules. Si une colonne s'appelle `ADR2` dans l'interface, il faut l'entourer de guillemets doubles dans la requête.
-- MAUVAIS : PostgreSQL va chercher 'adr2' en minuscules
WHERE ADR2 < '2024-01-01';
-- BON : Les guillemets forcent le respect des majuscules
WHERE "ADR2" < '2024-01-01';
Les bases pour poser des questions simples à vos données.
COUNT(*)
compte les lignes. WHERE
applique un filtre.
-- Compte le nombre de lignes où la date est avant le 1er Janvier 2024
SELECT COUNT(*)
FROM mercalys
WHERE "ADR2" < '2024-01-01';
SUM(colonne)
additionne les valeurs d'une colonne.
-- Calcule la somme de la colonne "VALO" pour les mêmes lignes filtrées
SELECT SUM("VALO")
FROM mercalys
WHERE "ADR2" < '2024-01-01';
Passer de milliers de lignes à des résumés clairs. C'est le cœur de l'analyse.
GROUP BY
crée des "paquets" pour chaque valeur unique et applique un calcul (comme SUM
) à chaque paquet.
-- Calcule la valorisation totale pour chaque combinaison unique de "NOM7" et "NOM"
SELECT
"NOM7",
"NOM",
SUM("VALO") AS valorisation_totale -- AS renomme la colonne du résultat
FROM mercalys
WHERE "ADR2" < '2024-01-01'
GROUP BY "NOM7", "NOM"
ORDER BY valorisation_totale DESC; -- ORDER BY trie le résultat final
La méthode pro avec ROLLUP
. Elle ajoute automatiquement une ligne de total général.
-- Fait la même chose, mais ajoute une ligne de total à la fin
SELECT
"NOM7",
"NOM",
SUM("VALO") AS valorisation_totale
FROM mercalys
WHERE "ADR2" < '2024-01-01'
GROUP BY ROLLUP("NOM7", "NOM");
Le concept le plus important : combiner des tables pour croiser les informations.
Même si les tables ne sont pas reliées sur le schéma, on peut les joindre dans une requête.
JOIN
. N'exige pas de colonne unique. C'est une règle temporaire, juste pour la requête.JOIN
combine les tables. ON
définit la règle de correspondance.
-- Relie 'mercalys' (surnom 'm') à 'mercalys_gadm_sap' (surnom 'g')
-- La règle est : quand la valeur de m."NOM7" est égale à celle de g.mercalys_nom
SELECT
m."LIBELLE COMMERCIAL", -- Colonne de la table 1
g.gadm_secteur, -- Colonne de la table 2
m."VALO"
FROM mercalys AS m
INNER JOIN mercalys_gadm_sap AS g ON m."NOM7" = g.mercalys_nom;
C'est ici que toute la puissance s'exprime : on utilise les informations d'une table pour regrouper les données d'une autre.
-- Calcule la valorisation totale ("VALO" de la table 1)
-- mais regroupée par secteur (gadm_secteur de la table 2)
SELECT
g.gadm_secteur,
SUM(m."VALO") AS valorisation_totale
FROM
mercalys AS m
INNER JOIN
mercalys_gadm_sap AS g ON m."NOM7" = g.mercalys_nom
GROUP BY
g.gadm_secteur
ORDER BY
valorisation_totale DESC;