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 :

Problème group by


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut Problème group by
    Bonjour,

    j'ai une question sur une de mes requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select 
    case 
        when d.deal_numadm!=0 and d.deal_numadm is not null 
            then 'MA' || d.deal_nummas || '_' || d.ntt_id 
        when d.deal_numadm=0 or d.deal_numadm is null 
            then 'Master' || d.deal_nummas || '_' || d.ntt_id 
    end as node_id, 
    sum(cva.cva), sum(dva.dva), d.deal_numadm, d.deal_nummas
    from acc_processed_cva cva 
    left outer join acc_processed_dva dva on dva.deal_id = cva.deal_id 
    join acc_deals d on d.deal_id = cva.deal_id and d.deal_scope='Y' 
    join dt_runs r on r.run_id = cva.run_id and r.deal_cnt_id = d.deal_cnt_id 
    where r.run_id=57 and d.deal_nummas=10700 and d.ntt_id = 1731413
    group by d.ntt_id, d.deal_nummas, d.deal_numadm, d.deal_cnt_id, d.ntt_id;
    Dans cette requête, le select d.deal_numadm est juste là pour montrer qu'il est différent dans chacune des lignes retournées par la requête :

    NODE_ID SUM(CVA.CVA) SUM(DVA.DVA) DEAL_NUMADM DEAL_NUMMAS
    MA10700_1731413 953180 1373440 22012 10700
    Master10700_1731413 4886330 4318999 0 10700
    MA10700_1731413 1654 1192 12054 10700
    MA10700_1731413 4 (null) 83442 10700
    MA10700_1731413 14 1093 10775 10700
    MA10700_1731413 963 (null) 10779 10700

    Ce que je voudrais, c'est une requête qui retourne ça (sans le d.deal_numadm):

    NODE_ID SUM(CVA.CVA) SUM(DVA.DVA) DEAL_NUMMAS
    MA10700_1731413 955815 1375725 10700
    Master10700_1731413 4886330 4318999 10700

    avec la 1ere ligne qui soit la somme des lignes 1, 3, 4, 5 et 6 du résultat précédent.

    J'ai essayé en enlevant le d.deal_numadm du group by de la requête, mais évidemment ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select 
    case 
        when d.deal_numadm!=0 and d.deal_numadm is not null 
            then 'MA' || d.deal_nummas || '_' || d.ntt_id 
        when d.deal_numadm=0 or d.deal_numadm is null 
            then 'Master' || d.deal_nummas || '_' || d.ntt_id 
    end as node_id, 
    sum(cva.cva), sum(dva.dva), d.deal_nummas
    from acc_processed_cva cva 
    left outer join acc_processed_dva dva on dva.deal_id = cva.deal_id 
    join acc_deals d on d.deal_id = cva.deal_id and d.deal_scope='Y' 
    join dt_runs r on r.run_id = cva.run_id and r.deal_cnt_id = d.deal_cnt_id 
    where r.run_id=57 and d.deal_nummas=10700 and d.ntt_id = 1731413
    group by d.ntt_id, d.deal_nummas, d.deal_cnt_id, d.ntt_id;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORA-00979: not a GROUP BY expression 
    00979. 00000 - "not a GROUP BY expression"
    C'est possible de faire ce que je veux ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    La règle est simple : les colonnes ou expressions de la clause SELECT qui ne font pas l'objet d'une fonction de regroupement doivent apparaître dans la clause GROUP BY.
    Donc, dans ton cas, l'expression CASE WHEN d.deal_numadm!=0 .. END doit être reprise intégralement dans la clause GROUP BY.
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    oui, vous pouvez faire comme ca :

    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
    SELECT node_id, sum(sum_cva), sum(sum_dva), deal_nummas
    FROM (
          SELECT 
          case 
              when d.deal_numadm!=0 AND d.deal_numadm IS NOT NULL 
                  then 'MA' || d.deal_nummas || '_' || d.ntt_id 
              when d.deal_numadm=0 OR d.deal_numadm IS NULL 
                  then 'Master' || d.deal_nummas || '_' || d.ntt_id 
          end AS node_id, 
          sum(cva.cva) sum_cva, sum(dva.dva) sum_dva, d.deal_numadm, d.deal_nummas
          FROM acc_processed_cva cva 
          LEFT OUTER JOIN acc_processed_dva dva ON dva.deal_id = cva.deal_id 
          JOIN acc_deals d ON d.deal_id = cva.deal_id AND d.deal_scope='Y' 
          JOIN dt_runs r ON r.run_id = cva.run_id AND r.deal_cnt_id = d.deal_cnt_id 
          WHERE r.run_id=57 AND d.deal_nummas=10700 AND d.ntt_id = 1731413
          GROUP BY d.ntt_id, d.deal_nummas, d.deal_numadm, d.deal_cnt_id, d.ntt_id
          )
    GROUP BY node_id, deal_nummas;

  4. #4
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Merci !

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

Discussions similaires

  1. Problème Group by
    Par tollaire dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/08/2007, 09h51
  2. SharePoint 2007 - Problème groupes et permissions
    Par Najla dans le forum SharePoint
    Réponses: 3
    Dernier message: 20/03/2007, 22h42
  3. Problème group by
    Par nellynew dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/01/2007, 15h28
  4. [SQL] Problème group by sur view
    Par helene34 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2007, 08h25
  5. Problème Group By
    Par Fishes83 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/01/2007, 13h52

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