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 :

Simplification de requete avec Union


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut Simplification de requete avec Union
    Bonjour,
    j'ai une requete avec 2 union, je l'ai simplifiée :

    Code SQL : 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
    WITH MaTable AS
    (
    select '1' mois, 1 val from dual
    UNION
    select '2', 2 from dual
    UNION
    select '3', 3 from dual
    UNION
    select '4', 4 from dual
    )
     
    select sum(val), periode
    from(
     
    select mois, val,'mois' periode
    from MaTable
    WHERE mois=1
     
    UNION
     
    select mois, val,'trimestre' periode
    from MaTable
    WHERE mois<=3
     
    UNION
     
    select mois, val,'annee' periode
    from MaTable
     
    ) group by periode

    Résultat :
    SUM(VAL) PERIODE
    ---------------------- ---------
    10 annee
    1 mois
    6 trimestre

    J'aimerais savoir si c'est simplifiable ou obligatoire d'avoir 2 union pour un même résultat?
    Merci d'avance

  2. #2
    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
    En 11g vous pouvez faire un UNPIVOT :
    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
    With RefMois AS
    (
    SELECT 1 as mois, 1 as val FROM dual UNION ALL
    SELECT 2        , 2        FROM dual UNION ALL
    SELECT 3        , 3        FROM dual UNION ALL
    SELECT 4        , 4        FROM dual
    )
      ,  SR as
    (  
    SELECT sum(val) as "Année",
           sum(case when mois <= 3 then val end) as "Trimestre",
           sum(case mois when 1 then val end) as "Mois"
      FROM RefMois
    )
    select *
    from SR
    unpivot (val for periode in ("Année", "Trimestre", "Mois"));
     
    PERIODE		VAL
    Année		10
    Trimestre	6
    Mois		1
    Avant 11g il faut toujours passer par des UNION ALL :
    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
    With RefMois AS
    (
    SELECT 1 as mois, 1 as val FROM dual UNION ALL
    SELECT 2        , 2        FROM dual UNION ALL
    SELECT 3        , 3        FROM dual UNION ALL
    SELECT 4        , 4        FROM dual
    )
      ,  SR as
    (  
    SELECT sum(val) as "Année",
           sum(case when mois <= 3 then val end) as "Trimestre",
           sum(case mois when 1 then val end) as "Mois"
      FROM RefMois
    )
    select 'Année' as periode, "Année" as val from SR union all
    select 'Trimestre'       , "Trimestre"    from SR union all
    select 'Mois'            , "Mois"         from SR;
     
    PERIODE		VAL
    Année		10
    Trimestre	6
    Mois		1
    Attention entre les valeurs de periode (simple quote) et les valeurs des sommes (doubles quotes).

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Waldar Voir le message
    ...
    Avant 11g il faut toujours passer par des UNION ALL :
    ...
    Unpivot: multiplier les données via une jointure cartésienne avec une table pivot et utiliser case (decode) pour transformer les colonnes en lignes
    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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.5.0 
    Connected as mni
     
    SQL> 
    SQL> WITH RefMois AS
      2  (
      3  SELECT 1 AS mois, 1 AS val FROM dual UNION ALL
      4  SELECT 2        , 2        FROM dual UNION ALL
      5  SELECT 3        , 3        FROM dual UNION ALL
      6  SELECT 4        , 4        FROM dual
      7  )
      8    ,  SR AS
      9  (
     10  SELECT sum(val) AS SumA,
     11         sum(case when mois <= 3 then val end) AS SumT,
     12         sum(case mois when 1 then val end) AS SumM
     13    FROM RefMois
     14  ),
     15  Pivot as (
     16    select level as rn from dual connect by level < 6
     17  ),
     18  Data as (
     19  Select *
     20    from sr
     21         Cross Join
     22         pivot
     23  )
     24  Select case
     25           when rn = 1 Then 'Année'
     26           when rn = 2 Then 'Trimestre'
     27           when rn = 3 Then 'Mois'
     28         End As periode,
     29         case
     30           when rn = 1 Then SumA
     31           when rn = 2 Then SumT
     32           when rn = 3 Then SumM
     33         End As periode
     34    From data
     35   Where rn <= 3
     36  /
     
    PERIODE      PERIODE
    --------- ----------
    Année             10
    Trimestre          6
    Mois               1

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut
    Ok, merci, et au niveau perfs, lequel vous préconisez?

  5. #5
    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
    Oui c'est vrai mnitu, le toujours n'était pas le mot le plus approprié.

    Côté perf, il faut de toutes façon tester mais je ne pense pas qu'il y ait d'énormes différences.

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

Discussions similaires

  1. Requetes avec Union et LIMIT global
    Par dimainfo dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/07/2013, 18h14
  2. Requetes avec union : hibernate
    Par sandrine49 dans le forum Hibernate
    Réponses: 5
    Dernier message: 14/04/2011, 12h16
  3. [MySQL] Construction de requête avec UNION
    Par kunchovich dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/07/2006, 19h40
  4. PL/SQL requete avec UNION
    Par lapartdombre dans le forum PL/SQL
    Réponses: 3
    Dernier message: 17/11/2005, 08h40
  5. Pb requete avec union et colonne maximale
    Par Karibou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/09/2005, 11h53

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