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 :

Impossible d'utiliser un alias dans une opération arithmétique avec une fonction analytique? [11gR2]


Sujet :

SQL Oracle

  1. #1
    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 Impossible d'utiliser un alias dans une opération arithmétique avec une fonction analytique?
    Bonjour,

    Sur une base de tests je fais le SELECT suivant :
    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
    SQL> select employee_id, salary, department_id, sum(salary) over (partition by department_id) TOTAL from employees order by 3
    EMPLOYEE_ID     SALARY DEPARTMENT_ID      TOTAL
    ----------- ---------- ------------- ----------
            200      35200            10      35200
            201     104000            20     152000
            202      48000            20     152000
            114      88000            30     199200
            115      24800            30     199200
            116      23200            30     199200
            117      22400            30     199200
            118      20800            30     199200
            119      20000            30     199200
            203      52000            40      52000
            120      64000            50    2125600
    ...
    Ce que je voudrais maintenant c'est obtenir le pourcentage du salaire de chaque employé par rapport à son département.
    Je fais le SELECT suivant avec un alias mais ça plante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select employee_id, salary, department_id, sum(salary) over (partition by department_id) TOTAL,  (salary/TOTAL)*100 from employees order by 3;
    ERROR at line 1:
    ORA-00904: "TOTAL": invalid identifier
    La requête marche avec duplication du calcul de la somme mais c'est moche comme code et je pense que le calcul du total par département est alors effectué deux fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select employee_id, salary, department_id, sum(salary) over (partition by department_id) TOTAL,  (salary/sum(salary) over (partition by department_id))*100 from employees order by 3;
    Si vous pouviez m'expliquer le comment du pourquoi de ce problème... par avance merci.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Cette facon d'écrire en utilisant directement l'alias TOTAL au sein de la même requête n'est pas forcément disponible avec tous les SGBD.
    En Teradata, tu n'aurais pas eu ce problème.

    Tu dois pouvoir voir dans le plan si ca te calcule deux fois ton résultat je pense.
    Si c'est le cas, tu peux essayer l'écriture suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select employee_id, salary, department_id, TOTAL, (salary/TOTAL)*100 as prct from (
    select employee_id, salary, department_id, sum(salary) over (partition by department_id) TOTAL from employees)
    order by 3;

    EDIT: Autant eviter de laisser passer des erreurs.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par bstevy Voir le message
    Cette facon d'écrire en utilisant directement l'alias TOTAL au sein de la même requête est correcte d'un point de vue SQL, mais pas forcément disponible avec tous les SGBD.
    Non elle est totalement incorrecte en SQL. Les alias de colonnes ne peuvent en aucun cas être utilisé dans le traitement relationnelle d'une requête (ce qui exclu de facto la clause ORDER BY qui n'est pas une clause relationnelle) sauf dans le cas de données résultantes d'une requêtes externe appliquée à une sous requête en table dérivée ou en CTE et bien entendu à une requête appliquée à une vue ou une UDF de type table.

    Effectivement certains SGBD le permette.....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    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
    @Ikebukuro

    Vous pouvez faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select employee_id, salary, department_id
           , sum(salary)             over (partition by department_id)       as total
           , ratio_to_report(salary) over (partition by department_id) * 100 as pct
        from employees
    order by department_id

  5. #5
    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
    Merci à vous tous pour vos réponses; visiblement mon problème n'était pas si simple que ça...

    Je ne connaissais pas la fonction ratio_to_report, maintenant c'est fait :-)
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

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

Discussions similaires

  1. Utilisation des alias dans la clause WHERE d'une requête SELECT
    Par OursRêveur dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 13/07/2013, 04h34
  2. [XL-2010] Faire une opération arithmétique sur une colonne
    Par SimKmil dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/05/2013, 17h50
  3. [SQL2K][TSQL] Peut-on utiliser un alias dans une clause Where ?
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/05/2006, 09h25
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. [Oracle 9.2]Utiliser un alias dans une contrainte ?
    Par belfaigore dans le forum Oracle
    Réponses: 5
    Dernier message: 29/06/2005, 14h18

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