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 :

Somme cumulée et ntile


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut Somme cumulée et ntile
    Aloha

    Je cherche à répartir une ensemble d'objet dont je calcule la surface en 10 groupes de population égale, pour lesquels (les groupes) je souhaite avoir la somme des surfaces des objets de chacun des groupes.

    Grâce à l'article de Laly Kattoor et Djug je sais répartir ma population :
    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
    SELECT 
           MIN (SURFACE_PARCELLE),
           MAX (SURFACE_PARCELLE),
           CATEGORIE,
           COUNT (GID) AS POPULATION
      FROM (SELECT GID,
                   SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1) SURFACE_PARCELLE,
     
                   NTILE (10) OVER (ORDER BY SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
                      CATEGORIE
              FROM    PCI_PARC P
                   RIGHT OUTER JOIN
                      "HILE".CST_PARCELLE_BATIE B
                   ON P.GID = B.GID_P
             WHERE SUBSTR (IDENT, 1, 3) IN (055, 058, 172, 454, 474, 573))
    GROUP BY CATEGORIE
    Mais quand je tente d'ajouter ma somme cumulée, ça coince.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
           MIN (SURFACE_PARCELLE),
           MAX (SURFACE_PARCELLE),
           CATEGORIE,
    SUM(SURFACE_PARCELLE) keep (dense_rank last order by CATEGORIE) AS VOLUME_SURFACE
    Et d'autres variantes, mais je n'y arrive pas.

    Quelqu'un a-t'il une idée ?
    D'avance, merci,

  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
    FIRST et LAST ne permettent pas de faire des sommes cumulées, il faut utiliser la composante analytique de SUM.
    Si j'ai bien compris votre requête, ça devrait être ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(SUM(SURFACE_PARCELLE)) over(ORDER BY CATEGORIE ASC) AS VOLUME_SURFACE

  3. #3
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Merci pour cette réponse que je vais tester.
    Entre temps j'avais réussi avec :
    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
    SELECT ROUND(VOLUME_SURFACE,2), COUNT (GID), CATEGORIE, SEUIL_BAS, SEUIL_HT
      FROM (SELECT SUM (SURFACE_PARCELLE)
                      OVER (PARTITION BY CATEGORIE ORDER BY CATEGORIE)
                      AS VOLUME_SURFACE,
                   FIRST_VALUE(SURFACE_PARCELLE)
                      OVER (PARTITION BY CATEGORIE ORDER BY CATEGORIE) AS SEUIL_BAS,
                   LAST_VALUE(SURFACE_PARCELLE)
                      OVER (PARTITION BY CATEGORIE ORDER BY CATEGORIE) AS SEUIL_HT,   
                   GID,
                   CATEGORIE
              FROM (SELECT GID,
                           SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1) SURFACE_PARCELLE,
                           NTILE (10)
                              OVER (ORDER BY SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
                              CATEGORIE
                      FROM    PCI_PARC P
                           RIGHT OUTER JOIN
                              "H.ILE".CST_PARCELLE_BATIE B
                           ON P.GID = B.GID_P
                     WHERE SUBSTR (IDENT, 1, 3) IN (055, 058, 172, 454, 474, 573)))
    GROUP BY CATEGORIE, VOLUME_SURFACE, SEUIL_BAS, SEUIL_HT

  4. #4
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Hummm.
    Cela se complique.

    Je décide de filtrer mes enregistrements de la table PCI_PARC selon le type de propriétaire et le nom de ce propriétaire. Cela afin de pouvoir au final ressortir un tableau analytique intégrant ce critère.

    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
     SELECT P.GID,
           MJ2_PROPRIO.DDENOM1,
            SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1) AS SURF_PARCELLE,
           SUM (B.SURFACE_BATIE) OVER (PARTITION BY MJ2_PROPRIO.DDENOM1, P.GID,SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1) ORDER BY B.SURFACE_BATIE) AS SURF_BATIE,
           NTILE (
              10)
           OVER (PARTITION BY MJ2_PROPRIO.DDENOM1
                 ORDER BY SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
              CATEGORIE,
           FIRST_VALUE (
              SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
           OVER (PARTITION BY MJ2_PROPRIO.DDENOM1
                 ORDER BY SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
              AS SEUIL_BAS,
           LAST_VALUE (
              SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
           OVER (PARTITION BY MJ2_PROPRIO.DDENOM1
                 ORDER BY SDO_GEOM.SDO_AREA (P.GEOMETRY, 0.1))
              AS SEUIL_HT
      FROM    (   (   (   A_REIMS.MJ2_PARCEL MJ2_PARCEL
                       INNER JOIN
                          A_REIMS.MJ2_PARCPROPRIO MJ2_PARCPROPRIO
                       ON     (MJ2_PARCEL.CCOCOM = MJ2_PARCPROPRIO.CCOCOM)
                          AND (MJ2_PARCEL.CCOPRE = MJ2_PARCPROPRIO.CCOPRE)
                          AND (MJ2_PARCEL.CCOSEC = MJ2_PARCPROPRIO.CCOSEC)
                          AND (MJ2_PARCEL.DNUPLA = MJ2_PARCPROPRIO.DNUPLA))
                   INNER JOIN
                      A_REIMS.MJ2_PROPRIO MJ2_PROPRIO
                   ON     (MJ2_PARCPROPRIO.DNUPRO = MJ2_PROPRIO.DNUPRO)
                      AND (MJ2_PARCPROPRIO.CCOCOM = MJ2_PROPRIO.CCOCOM)
                      AND (MJ2_PARCPROPRIO.DNULP = MJ2_PROPRIO.DNULP))
               INNER JOIN
                  A_REIMS.PCI_PARC P
               ON (SUBSTR (P.IDENT, 7, 2) =
                      LPAD(MJ2_PARCEL.CCOSEC,2,'0'))
                  AND (SUBSTR (P.IDENT, 1, 3) = MJ2_PARCEL.CCOCOM)
                  AND (SUBSTR (P.IDENT, 9, 4) = MJ2_PARCEL.DNUPLA))
           RIGHT OUTER JOIN
              "H.ILE".CST_PARCELLE_BATIE B
           ON (P.GID = B.GID_P)
     WHERE (MJ2_PROPRIO.GTOPER = '2') AND (MJ2_PROPRIO.CCOGRM = '5 ')
    --GROUP BY P.GID,
    --       MJ2_PROPRIO.DDENOM1
    Ca ne marche pas des masses. Je ne vois pas comment sommer les surfaces de bâtiments par parcelle.
    J'ai en effet X lignes par parcelles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    25162	PROPRIO X                             	119,959249998371	24,4420	1	4,53520000045265	119,959249998371
    25162	PROPRIO X                             	119,959249998371	97,5080	1	4,53520000045265	119,959249998371
    25162	PROPRIO X                             	119,959249998371	88,4270	1	4,53520000045265	119,959249998371
    Alors que je ne souhaite qu'une ligne : celle avec 97m²5080 de bâti (la somme de toutes les surfaces bâties de la parcelle).

    Comment faire pour obtenir un indice (NTILE) sur la répartition de ces cumuls de surfaces bâties par propriétaire ?

    D'avance merci,

Discussions similaires

  1. somme cumulative su BO reporter
    Par cricri2607 dans le forum Débuter
    Réponses: 4
    Dernier message: 26/11/2008, 11h40
  2. Somme cumulative sur 12 mois glissant
    Par Ptij16 dans le forum Deski
    Réponses: 6
    Dernier message: 13/07/2007, 10h24
  3. somme cumulative sql
    Par marcdonaldwilfried dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/04/2007, 12h25
  4. ! Somme Cumulative en SQL !
    Par dom283 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2007, 18h25
  5. somme cumulative
    Par gsquad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2006, 17h18

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