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

SQL Oracle Discussion :

Récupérer un nom de colonne avec date de façon dynamique


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 117
    Points : 51
    Points
    51
    Par défaut Récupérer un nom de colonne avec date de façon dynamique
    Bonjour,

    J'ai une table qui contient des effectifs par an. Ces effectifs sont en colonne, comme ceci :
    Nom : efffectif.PNG
Affichages : 64
Taille : 45,3 Ko

    Je souhaite récupérer de façon dynamique les effectifs 2021, 2022, 2023, 2024 et 2025.

    Je ne sais comment je pourrais faire ça en SQL.

    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    avril 2013
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 1 770
    Points : 2 151
    Points
    2 151
    Par défaut
    Qu'est-ce que tu entends par "récupérer de façon dynamique"?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 117
    Points : 51
    Points
    51
    Par défaut
    Bonjour @ Ikebukuro


    Lorsque je dis que je souhaite récupérer les colonnes de façon dynamique c'est à dire que dans ma table, j'ai à chaque fois l'effectif (ETP) avec l'année.
    Dans la capture d'écran ci-jointe , j'ai juste mis quelques colonnes mais dans ma table j'ai les colonnes suivantes:

    ETP_2020
    ETP_2021
    ETP_2022
    ETP_2023
    ETP_2024
    ETP_2025
    ETP_2026
    .
    .
    .
    .
    ETP_2032

    Mon but est de récupérer l'éffectif de l'année courante N(2021) , l'effectif de l'année N+1(2022), l'effectif de l'année N+2 (2023) , l'effectif de l'année N+3 (2024) et l'effectif de l'année N+4 (2025).

    L'an prochain je devrais récupérer l'effectif de l'année N (2022) , l'effectif de l'année N+1(2023), l'effectif de l'année N+2 (2024) , l'effectif de l'année N+3 (2025) et l'effectif de l'année N+4 (2026).

    C'est pour cela que je souhaite récupérer les colonnes de façon dynamique mais je ne sais pas si c'est possible en ORACLE SQL

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 890
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    Tu ne pourras pas le faire avec une requête SQL simple. Tu pourras le faire en SQL*Plus avec des variables de substitutions, ou en pl/sql avec du sql dynamique. Si tu veux le faire dans un éditeur, alors tu pourras aussi utiliser des variables de substitution je pense. Tout dépend si tu dois le faire de manière automatique ou pas.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    mai 2002
    Messages
    8 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 8 916
    Points : 29 819
    Points
    29 819
    Par défaut
    Bonjour,

    Directement en SQL, il ne sera pas possible de récupérer directement le contenu des colonnes correspondant à une date.

    Il va être nécessaire de passer par une procédure stockée qui :
    • identifiera la colonne (ou les colonnes) à retourner,
    • construira le texte de la requête de manière dynamique,
    • l'exécutera (commande EXECUTE IMMEDIATE)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    juillet 2003
    Messages
    4 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : juillet 2003
    Messages : 4 576
    Points : 7 729
    Points
    7 729
    Billets dans le blog
    4
    Par défaut
    Tu peux le faire en SQL si tu as quelques colonnes. et que le SELECT soit en fonction de la définition de table actuelle.
    Suffit d'utiliser un CASE et tester chaque année possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH t AS (SELECT 0 A2020, 1 A2021, 2 A2022, 3 A2023, 4 A2024, 5 A2025 FROM dual)
    SELECT 
    	case extract(year from SYSDATE) WHEN 2020 then A2020 WHEN 2021 THEN A2021 WHEN 2022 THEN A2022 WHEN 2023 THEN A2023 END AnneeN,
    	case extract(year from SYSDATE) WHEN 2020 then A2021 WHEN 2021 THEN A2022 WHEN 2022 THEN A2023 WHEN 2023 THEN A2024 END AnneeN1,
    	case extract(year from SYSDATE) WHEN 2020 then A2022 WHEN 2021 THEN A2023 WHEN 2022 THEN A2024 WHEN 2023 THEN A2025 END AnneeN2
    from t
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2015
    Messages : 117
    Points : 51
    Points
    51
    Par défaut
    Merci à tous pour vos réponses.

    Effectivement ça semble compliqué en SQL. Je vais donc utiliser ma deuxième solution, passer par un ETL.

    Encore merci

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    8 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 241
    Points : 17 205
    Points
    17 205
    Par défaut
    J'aime bien la solution proposée par McM.

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 754
    Points : 3 960
    Points
    3 960
    Par défaut
    Si votre version d'ORACLE le permet, vous pouvez aussi vous inspirer de "Echo Polymorphic Table Function Example" icihttps://docs.oracle.com/en/database/...6-D5B632AB8072

    pour créer votre propre fonction qui prendra en paramètre l'année de départ:
    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
     
    CREATE PACKAGE BODY filterfromyear_package
    AS
      FUNCTION describe(tab  IN OUT DBMS_TF.TABLE_T,
                        cols IN DBMS_TF.COLUMNS_T, year IN NUMBER)
      RETURN DBMS_TF.DESCRIBE_T
      AS
        new_cols DBMS_TF.COLUMNS_NEW_T;
    ...
      BEGIN
     
     
    ...
     
     
          RETURN DBMS_TF.DESCRIBE_T(new_columns => new_cols);
      END;
     
    END filterfromyear_package;
     
     
    CREATE FUNCTION filter_from_year(tab TABLE,
                         cols COLUMNS, year NUMBER)
      RETURN TABLE 
      PIPELINED ROW POLYMORPHIC USING filterfromyear_package;
     
     
    SELECT *
    FROM   filter_from_year(my_table, COLUMNS( other columns you want to see in the result, etp_2021, ...), 2025) ;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le nom d'un procédure d'une façon dynamique
    Par islamov2000 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 08/12/2015, 10h23
  2. Réponses: 7
    Dernier message: 12/04/2007, 15h04
  3. [C#] Récupérer le nom des colonnes d'une datatable
    Par dai.kaioh dans le forum Accès aux données
    Réponses: 6
    Dernier message: 28/09/2006, 18h35
  4. [PostGreSQL] Récupérer les noms des colonnes
    Par Olivier14 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/02/2006, 19h51
  5. Comment récupérer le nom des colonnes ?
    Par constantin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/10/2005, 12h29

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