Mémo SQL Pratique

De l'Importation des Données à l'Analyse Croisée

1. Importer les Données : Les Pièges Courants

L'importation est la première étape. Voici les erreurs classiques et leurs solutions.

Problème 1 : Les Nombres Décimaux

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.

Problème 2 : La Limite de Lignes

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.

Problème 3 : Le Format des Dates

Les dates sont importées comme du texte (23/11/2024) car SQL attend le format YYYY-MM-DD.

Solution : Importer en tant que texte, puis convertir. Voir section suivante.

2. Nettoyer & Transformer : La Magie de l'UPDATE

Une fois les données importées, il faut souvent les corriger. C'est l'étape de nettoyage.

Convertir du Texte en Date

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');

Attention à la Casse (Majuscules/Minuscules)

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';

3. Interroger : Les Fondamentaux

Les bases pour poser des questions simples à vos données.

Compter des Lignes avec un Filtre

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';

Additionner des Valeurs avec un Filtre

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';

4. Regrouper & Agréger : La Synthèse

Passer de milliers de lignes à des résumés clairs. C'est le cœur de l'analyse.

Regrouper par une ou plusieurs colonnes

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

Obtenir les Sous-Totaux ET le Grand Total

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");

5. Relier les Tables : La Puissance Relationnelle

Le concept le plus important : combiner des tables pour croiser les informations.

Lien Physique vs. Lien Logique

Même si les tables ne sont pas reliées sur le schéma, on peut les joindre dans une requête.

La Jointure : `INNER JOIN`

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;

Le Combo Ultime : Jointure + Agrégation

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;