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
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 124
    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 : 126
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 émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    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 993
    Points : 2 499
    Points
    2 499
    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
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 124
    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 chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    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 : 1 137
    Points : 1 917
    Points
    1 917
    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
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    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 580
    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 580
    Points : 7 740
    Points
    7 740
    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
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 124
    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
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

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

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    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, 09h23
  2. Réponses: 7
    Dernier message: 12/04/2007, 14h04
  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, 17h35
  4. [PostGreSQL] Récupérer les noms des colonnes
    Par Olivier14 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/02/2006, 18h51
  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, 11h29

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