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 : 33
    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
    956
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 58
    Localisation : France, Is�re (Rh�ne Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    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