IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Difficultés à affecter des résultats sur une colonne en cours de route


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 1
    Par défaut Difficultés à affecter des résultats sur une colonne en cours de route
    Bonjour, ça fait quelques jours que je me creuse la tête (j'ai un trou!) sans réussir à trouver la solution, alors j'ai fini par me créer un compte pour vous demander un peu d'aide.

    Voila, je tape mes requêtes en postgresql.
    J'ai une table dans laquelle j'ai des clients qui me passent une commande chaque année.
    Ma table est composée de trois variables, le nom du client, la date de la commande, le montant.
    Dans cette table j'ai au moins 12 ans de commandes.

    Je souhaite sélectionner les clients dont le montant de la commande sur les trois dernières années (2020, 2021, 2022) est supérieur à 50 000€, et je souhaite afficher ces montant par une colonne représentant chaque année.

    Je souhaite également savoir si ces clients ont dépassé ce seuil deux années consécutives.

    J'extrais donc l'année à partir de la date de commande pour ne conserver que celles de 2020, 2021 et 2022.
    A l'aide d'un CASE WHEN j'affecte le montant à la colonne 2020, 2021 ou 2022.

    Puis j'en profite pour tester si 2020 et 2021 ont dépassé le seuil auquel cas on affiche positif dans une colonne 2020_2021, ou 2021 et 2022 ont dépassé le seuil auquel cas on affiche positif dans une colonne 2021_2022.
    Problème : j'ai un message d'erreur qui me dit les colonnes 2020, 2021 et 2022 ne sont pas créées donc on ne peut rien y affecter.

    Voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    DROP TABLE IF EXISTS table_test ; 
     
    CREATE TABLE table_test AS 
        SELECT 
        num_cli, 
        date_com, 
        mt_com,
     
        CASE 
            WHEN EXTRACT(YEAR FROM date_com) = 2020 THEN mt_com 
            ELSE 0 
        END AS resultat_2020,     
     
     
        CASE 
            WHEN EXTRACT(YEAR FROM date_com) = 2021 THEN mt_com 
            ELSE 0 
        END AS resultat_2021, 
     
        CASE 
            WHEN EXTRACT(YEAR FROM date_com) = 2022 THEN mt_com 
            ELSE 0 
        END AS resultat_2022,
     
        CASE 
    	WHEN resultat_2020 > 50000 AND resultat_2021 > 50000 THEN 'positif' 
    		ELSE NULL 
    	END AS positif_2020_2021, 
     
    	CASE
    		WHEN resultat_2021 > 50000 AND resultat_2022 > 50000 THEN 'positif' 
    		ELSE NULL 
    	END AS positif_2021_2022,
     
    	CASE 
    		WHEN positif_2020_2021 = 'positif' AND positif_2021_2022 = 'positif' THEN 'double positif' 
    		ELSE NULL 
    	END AS double_positif 
     
        FROM table_comande
    	WHERE EXTRACT(YEAR FROM date_com) IN (2020, 2021, 2022)
    Et j'obtiens le message d'erreur suivant :
    column "positif_2020_2021" does not exist
    LINE 34 : WHEN positif_2020_2021 = 'positif' AND positif_2021_2022 =...
    Alors je soupçonne que la commande n'étant créée qu'en sortie je ne puisse pas travailler dessus? Mais dans ce cas est-ce qu'il faut que je la créée au préalable? Avec une commande de type INSERT INTO?

    Merci par avance pour vos éclairages.

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 939
    Par défaut
    L'ordre SELECT n'est pas une procédure !
    A la suite de l'ordre select il y a les vecteurs qui seront présentés lors de l'execution.
    De fait on ne peux pas utiliser les noms de colonnes comme source de l'expression du vecteur suivant.

    L'astuce est de faire la requête en plusieurs temps.

    Le premier temps est de créer le set de travail :
    SELECT
    num_cli,
    date_com,
    mt_com,
    CASE
    WHEN EXTRACT(YEAR FROM date_com) = 2020 THEN mt_com
    ELSE null
    END AS resultat_2020,
    CASE
    WHEN EXTRACT(YEAR FROM date_com) = 2021 THEN mt_com
    ELSE null
    END AS resultat_2021,
    CASE
    WHEN EXTRACT(YEAR FROM date_com) = 2022 THEN mt_com
    ELSE null
    END AS resultat_2022
    FROM table_comande
    WHERE EXTRACT(YEAR FROM date_com) IN (2020, 2021, 2022)
    Ensuite utiliser ce set comme source pour l'analyse
    SELECT *, CASE
    WHEN resultat_2020 > 50000 AND resultat_2021 > 50000 THEN 'positif'
    ELSE NULL
    END AS positif_2020_2021,
    CASE
    WHEN resultat_2021 > 50000 AND resultat_2022 > 50000 THEN 'positif'
    ELSE NULL
    END AS positif_2021_2022,
    CASE
    WHEN positif_2020_2021 = 'positif' AND positif_2021_2022 = 'positif' THEN 'double positif'
    ELSE NULL
    END AS double_positif
    from [le set de la requete précédente]
    et la magie du SQL c'est que c'et possible en 1 seule commande grâce aux CTE (ça permet de faire d'autre choses, je te conseille de faire des recherches )
    Pour ça il faut un peu de méthode et nommer le set de la première requête. Disons "cde_20_21_22"
    et ça donne :
    with cde_20_21_22 as
    (
    SELECT
    num_cli,
    date_com,
    mt_com,
    CASE
    WHEN EXTRACT(YEAR FROM date_com) = 2020 THEN mt_com
    ELSE null
    END AS resultat_2020,
    CASE
    WHEN EXTRACT(YEAR FROM date_com) = 2021 THEN mt_com
    ELSE null
    END AS resultat_2021,
    CASE
    WHEN EXTRACT(YEAR FROM date_com) = 2022 THEN mt_com
    ELSE null
    END AS resultat_2022
    FROM table_comande
    WHERE EXTRACT(YEAR FROM date_com) IN (2020, 2021, 2022)
    )
    SELECT *, CASE
    WHEN resultat_2020 > 50000 AND resultat_2021 > 50000 THEN 'positif'
    ELSE NULL
    END AS positif_2020_2021,
    CASE
    WHEN resultat_2021 > 50000 AND resultat_2022 > 50000 THEN 'positif'
    ELSE NULL
    END AS positif_2021_2022,
    CASE
    WHEN positif_2020_2021 = 'positif' AND positif_2021_2022 = 'positif' THEN 'double positif'
    ELSE NULL
    END AS double_positif
    from cde_20_21_22 /* [le set de la requete précédente] */
    ça va faire ce que tu as demandé.
    Mon petit doigt me dit que c'est pas exactement ce que tu souhaitais ; mais c'est à toi de bien formuler, donc bien comprendre, ton besoin

Discussions similaires

  1. pgAdmin : créer un rôle et lui affecter des droits sur une base
    Par jmnicolas dans le forum Administration
    Réponses: 1
    Dernier message: 14/10/2010, 11h47
  2. Réponses: 11
    Dernier message: 19/12/2007, 15h13
  3. Réponses: 4
    Dernier message: 30/11/2007, 10h10
  4. Affecter des evenements sur une nouvelle balise
    Par Arnard dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/11/2006, 16h18
  5. SQLServer 2000: Liste des contraintes sur une colonne ?
    Par swirtel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/11/2005, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo