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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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 confirmé 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
    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 confirmé
    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
    Par défaut
    Ok, merci, et au niveau perfs, lequel vous préconisez?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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