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 :

Regroupement avec la fonction coalesce [11g]


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Par défaut Regroupement avec la fonction coalesce
    Bonjour à tous,

    Lors d'une question précédente (autre post), je cherchais à obtenir des valeurs précédentes non nulles d'un Row pour une séquence manquante. Avec votre aide, j'ai pu y arriver à l'aide de la fonction "coalesce". Aujourd'hui, je dois traiter une nouvelle colonne et m'assurer que les traitements précédents soient faits uniquement sur les groupes de cette nouvelle colonne. C'est dans ce contexte que j'aurais besoin de votre aide, car je suis incapable d'effectuer ce traitement par groupe...

    Donc, ma requête originale qui faisait le travail (sans la nouvelle colonne) est la suivante:
    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
     
    WITH MaTable AS(
    SELECT 2 AS NoId, 327 AS Pb, 'bbb' AS Code FROM dual union ALL
    SELECT 3        , NULL     , 'ccc'         FROM dual union ALL
    SELECT 5        , 349      , NULL          FROM dual
    ),
     
      SEQ AS(
    SELECT LEVEL AS lvl FROM dual CONNECT BY LEVEL <= 6
    ),
     
      DataFromId AS (
    SELECT SEQ.lvl
          ,MaTable.NoId
          ,coalesce(MaTable.NoId
                    ,Lag(MaTable.NoId IGNORE nulls) over(ORDER BY SEQ.lvl)
                    ,(SELECT max(MaTable.NoId) FROM MaTable)
                    ) AS FromID
    FROM SEQ
      LEFT JOIN MaTable ON SEQ.lvl=MaTable.NoId
    ORDER BY 1,2
    )
     
    SELECT DataFromId.lvl, DataFromId.FromID, MaTable.Pb, MaTable.Code
    FROM MaTable
      LEFT JOIN DataFromId ON MaTable.NoId=DataFromId.FromID
    WHERE DataFromId.NoId IS NULL
    ;
     
           LVL     FROMID         PB CODE
    ---------- ---------- ---------- ----
             1          5        349      
             4          3            ccc  
             6          5        349
    Ce que j'aimerais être capable de faire, c'est d'obtenir le même résultat que la requête précédente, mais cette fois, regroupée par les valeurs de la colonne "Groupe". Donc, si ma table "MaTable" avait les données suivantes, j'aimerais que le résultat soit le suivant. Pour y arriver, il faudra sans doute modifier la fonction coalesce pour que le paramètre "(SELECT max(MaTable.NoId) FROM MaTable)" soit fait également en fonction du groupe.
    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
     
    WITH MaTable AS(
    SELECT 'A1A1A' AS Groupe, 2 AS NoId, 327 AS Pb, 'bbb' AS Code FROM dual union ALL
    SELECT 'A1A1A'	 	, 3        , NULL     , 'ccc'         FROM dual union ALL
    SELECT 'A1A1A'	 	, 5        , 349      , NULL          FROM dual union ALL
    SELECT 'B2B2B'		, 2        , 222      , 'bbb'         FROM dual union ALL
    SELECT 'B2B2B'		, 3        , 333      , 'ccc'         FROM dual union ALL
    SELECT 'B2B2B'		, 4        , 444      , 'ddd'         FROM dual union ALL
    SELECT 'B2B2B'		, 5        , 555      , 'eee'         FROM dual union ALL
    SELECT 'B2B2B'		, 6        , 666      , 'fff'         FROM dual
    )
     
     
        GROUPE	  LVL     FROMID         PB CODE
    ---------- ---------- ---------- ---------- ----
         A1A1A          1          5        349      
         A1A1A          4          3            ccc  
         A1A1A          6          5        349      		 
         B2B2B          1          6        666 fff
    Merci beaucoup!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Par défaut
    Finalement, je l'ai eu!

    La requête ressemble à celle-ci:
    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
    42
    43
    44
    45
    46
    47
     
    WITH MaTable AS(
    SELECT 'A1A1A' AS Groupe, 2 AS NoId, 327 AS Pb, 'bbb' AS Code FROM dual union ALL
    SELECT 'A1A1A'	 	, 3        , NULL     , 'ccc'         FROM dual union ALL
    SELECT 'A1A1A'	 	, 5        , 349      , NULL          FROM dual union ALL
    SELECT 'B2B2B'		, 2        , 222      , 'bbb'         FROM dual union ALL
    SELECT 'B2B2B'		, 3        , 333      , 'ccc'         FROM dual union ALL
    SELECT 'B2B2B'		, 4        , 444      , 'ddd'         FROM dual union ALL
    SELECT 'B2B2B'		, 5        , 555      , 'eee'         FROM dual union ALL
    SELECT 'B2B2B'		, 6        , 666      , 'fff'         FROM dual
    ),
    -- Sequence complète de référence
      SEQ AS(
    SELECT LEVEL AS NoID FROM dual CONNECT BY LEVEL <= 6
    ),
    -- Séquences manquantes
      MissingSEQ AS(
    SELECT Groupe, SEQ.NoID, null as Pb, null as Code
    FROM (SELECT distinct Groupe from MaTable) a, SEQ
    WHERE not exists (SELECT null FROM MaTable b WHERE b.NoID=SEQ.NoID AND a.Groupe=b.Groupe)
    ORDER BY 1,2
    )
    --select * from MissingSEQ;
    SELECT  MissingSEQ.Groupe
           ,MissingSEQ.NoID
           ,(SELECT Pb
             FROM MaTable 
             WHERE MaTable.Groupe=MissingSEQ.Groupe
               AND MaTable.NoID=nvl((Select max(MaTable.NoID) from MaTable where MaTable.Groupe=MissingSEQ.Groupe and MaTable.NoID<MissingSEQ.NoID)
                                       ,(Select max(MaTable.NoID) from MaTable where MaTable.Groupe=MissingSEQ.Groupe))
            ) AS Pb
           ,(SELECT Code
             FROM MaTable 
             WHERE MaTable.Groupe=MissingSEQ.Groupe
               AND MaTable.NoID=nvl((Select max(MaTable.NoID) from MaTable where MaTable.Groupe=MissingSEQ.Groupe and MaTable.NoID<MissingSEQ.NoID)
                                       ,(Select max(MaTable.NoID) from MaTable where MaTable.Groupe=MissingSEQ.Groupe))
            ) AS Code        
    FROM MissingSEQ
    ;
     
     
    GROUPE       NOID         PB CODE
    ------ ---------- ---------- ----
    A1A1A           1        349      
    A1A1A           4            ccc  
    A1A1A           6        349      
    B2B2B           1        666 fff
    Je suis ouvert à toute optimisation!

    Merci

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

Discussions similaires

  1. Fonction COALESCE avec un LIKE
    Par nekro65 dans le forum Langage SQL
    Réponses: 17
    Dernier message: 25/03/2009, 16h15
  2. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 17h37
  3. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 10h04
  4. Réponses: 13
    Dernier message: 20/03/2003, 09h11
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 14h22

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