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 :

Calculer une évolution


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 105
    Par défaut Calculer une évolution
    Bonjour,

    Je ne parviens pas à créer une requête me permettant de mesurer une évolution.
    Pouvez-vous m'apporter votre aide.

    J'ai une table de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ANNEE    ACTE    SURFACE
    2000      A         10
    2001      V          2
    2003      A        100
    2004      V         10
    2004      A         80
    J'aimerai obtenir un retour du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ANNEE    SURFACE_TOTALE
    2000         10
    2001          8
    2003         118
    2004         178
    Merci,

  2. #2
    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
    Case pour +/-, Group By pour agréger par exercice et analytique pour somme évolutive
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> With Data As (
      2    Select 2000 ANNEE, 'A' Acte, 10 SURFACE From dual union all
      3    Select 2001, 'V', 2 From dual union all
      4    Select 2003, 'A', 100 From dual union all
      5    Select 2004, 'V', 10 From dual union all
      6    Select 2004, 'A', 80  From dual
      7  ),
      8  Tot_Par_Exercice As (
      9    Select Annee, Sum( Case Acte
     10                         When 'A' Then Surface
     11                         Else -Surface
     12                       End
     13                      ) Tot_Surface
     14      From Data
     15     Group BY Annee
     16  )
     17  Select Annee, Sum(tot_surface) over(order by annee) Evo_Surf
     18    From Tot_Par_Exercice
     19  /
     
         ANNEE   EVO_SURF
    ---------- ----------
          2000         10
          2001          8
          2003        108
          2004        178
     
    SQL>

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut,
    Si je me plante pas, ça peut s'aggréger en un coup :

    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
     
    SQL MAAT> WITH DATA AS (
      2        SELECT 2000 ANNEE, 'A' Acte, 10 SURFACE FROM dual union ALL
      3        SELECT 2001, 'V', 2 FROM dual union ALL
      4        SELECT 2003, 'A', 100 FROM dual union ALL
      5        SELECT 2004, 'V', 10 FROM dual union ALL
      6        SELECT 2004, 'A', 80  FROM dual
      7      )
      8      SELECT Annee, Sum(sum( case acte when 'A' then surface else -surface end)) over(ORDER BY annee) Evo_Surf
      9       FROM data
     10       group by annee
     11  /
     
         ANNEE   EVO_SURF
    ---------- ----------
          2000         10
          2001          8
          2003        108
          2004        178

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut,
    Si je me plante pas, ça peut s'aggréger en un coup :
    Oui mais l'optimiseur se charge de cette transformation, il peut donc être plus clair d'un point de vue maintenance de rajouter une étape dans l'écriture d'une requête.

    Le 10053 :
    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
    ....
     
    ******************************************
    ----- Current SQL Statement for this session (sql_id=3b06d22b72pxp) -----
    WITH DATA AS (
    SELECT 2000 ANNEE, 'A' Acte, 10 SURFACE FROM dual union ALL
    SELECT 2001, 'V', 2 FROM dual union ALL
    SELECT 2003, 'A', 100 FROM dual union ALL
    SELECT 2004, 'V', 10 FROM dual union ALL
    SELECT 2004, 'A', 80  FROM dual
    ),
    Tot_Par_Exercice AS (
    SELECT Annee,
           Sum( Case Acte
                When 'A' Then Surface
                Else -Surface
                 End
              ) Tot_Surface
      FROM DATA
     GROUP BY Annee
    )
    SELECT Annee, Sum(tot_surface) over(ORDER BY annee) Evo_Surf
      FROM Tot_Par_Exercice
    *******************************************
     
    ......
     
    CVM:   Merging complex view SEL$6 (#0) into SEL$7 (#0).
    qbcp:******* UNPARSED QUERY IS *******
    SELECT "TOT_PAR_EXERCICE"."ANNEE" "ANNEE",SUM("TOT_PAR_EXERCICE"."TOT_SURFACE") OVER ( ORDER BY "TOT_PAR_EXERCICE"."ANNEE" RANGE  BETWEEN  UNBOUNDED  PRECEDING  AND  CURRENT ROW ) "EVO_SURF" FROM  (SELECT "DATA"."ANNEE" "ANNEE",SUM(CASE "DATA"."ACTE" WHEN 'A' THEN "DATA"."SURFACE" ELSE (-"DATA"."SURFACE") END ) "TOT_SURFACE" FROM  ( (SELECT 2000 "ANNEE",'A' "ACTE",10 "SURFACE" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2001 "2001",'V' "'V'",2 "2" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2003 "2003",'A' "'A'",100 "100" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'V' "'V'",10 "10" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'A' "'A'",80 "80" FROM "SYS"."DUAL" "DUAL")) "DATA" GROUP BY "DATA"."ANNEE") "TOT_PAR_EXERCICE"
    vqbcp:******* UNPARSED QUERY IS *******
    SELECT "DATA"."ANNEE" "ANNEE",SUM(CASE "DATA"."ACTE" WHEN 'A' THEN "DATA"."SURFACE" ELSE (-"DATA"."SURFACE") END ) "TOT_SURFACE" FROM  ( (SELECT 2000 "ANNEE",'A' "ACTE",10 "SURFACE" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2001 "2001",'V' "'V'",2 "2" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2003 "2003",'A' "'A'",100 "100" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'V' "'V'",10 "10" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'A' "'A'",80 "80" FROM "SYS"."DUAL" "DUAL")) "DATA" GROUP BY "DATA"."ANNEE"
    CVM: result SEL$7 (#0)
    ******* UNPARSED QUERY IS *******
    SELECT "DATA"."ANNEE" "ANNEE",SUM(SUM(CASE "DATA"."ACTE" WHEN 'A' THEN "DATA"."SURFACE" ELSE (-"DATA"."SURFACE") END )) OVER ( ORDER BY "DATA"."ANNEE" RANGE  BETWEEN  UNBOUNDED  PRECEDING  AND  CURRENT ROW ) "EVO_SURF" FROM  ( (SELECT 2000 "ANNEE",'A' "ACTE",10 "SURFACE" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2001 "2001",'V' "'V'",2 "2" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2003 "2003",'A' "'A'",100 "100" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'V' "'V'",10 "10" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'A' "'A'",80 "80" FROM "SYS"."DUAL" "DUAL")) "DATA" GROUP BY "DATA"."ANNEE"
     
    ....
     
    Final query after transformations:******* UNPARSED QUERY IS *******
    SELECT "DATA"."ANNEE" "ANNEE",SUM(SUM(CASE  WHEN "DATA"."ACTE"='A' THEN "DATA"."SURFACE" ELSE (-"DATA"."SURFACE") END )) OVER ( ORDER BY "DATA"."ANNEE" RANGE  BETWEEN  UNBOUNDED  PRECEDING  AND  CURRENT ROW ) "EVO_SURF" FROM  ( (SELECT 2000 "ANNEE",'A' "ACTE",10 "SURFACE" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2001 "2001",'V' "'V'",2 "2" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2003 "2003",'A' "'A'",100 "100" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'V' "'V'",10 "10" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2004 "2004",'A' "'A'",80 "80" FROM "SYS"."DUAL" "DUAL")) "DATA" GROUP BY "DATA"."ANNEE"
     
    ....

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 105
    Par défaut
    Je test tout cela de suite.
    Un détail m'embête pour le moment.

    Dans l'exemple, j'ai indiqué 2001, 2002, .... Mais j'ai oublié de préciser que cette table est alimentée régulièrement. J'aimerais trouver une solution sans devoir écrire les dates en dur dans la requête.

    Une idée ?

    Merci,

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Pas de problème, les dates en dur que tu voies dans les requêtes qui te sont proposées ne sont que des jeux de données. (Ce qui nous permet d'afficher un résultat, vu qu'on ne dispose pas de la vraie table contrairement à toi)

    A adapter à ton cas concret, mais ta table s'appelle DATA, cette partie de la requête suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Annee, Sum(sum( case acte when 'A' then surface else -surface end)) over(ORDER BY annee) Evo_Surf
    FROM DATA
    GROUP BY annee

Discussions similaires

  1. calculer une date Langage c
    Par nestam dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/09/2005, 15h51
  2. Réponses: 7
    Dernier message: 05/07/2005, 16h50
  3. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16
  4. Calculer une duree entre 2 dates
    Par d.w.d dans le forum C++
    Réponses: 7
    Dernier message: 02/03/2005, 22h39
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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