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

Langage SQL Discussion :

Problème requête de pourcentages


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 37
    Points
    37
    Par défaut Problème requête de pourcentages
    Bonjour,


    je dispose d'une table contenant des réseaux d'éclairages de différentes communes, je souhaite avoir un apperçus en pourcent de l'état de la géolocalisation par commune et par type de de réseau (aérien, enterré ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT
    r.commune,  --commune
    r.type_reseau, --  type de réseau
    r.qualglocxy AS classe_precision, -- précision geoloc (A,B,C)
    count(r.qualglocxy) AS nombre,
    sum(st_length(r.geometrie)) as m_lineaire,--longueur réseau
    round(sum(st_length(r.geometrie)) * 100::double precision / tot.total) AS pourcentage
    FROM eclairage.ep_reseau r, 
    (SELECT sum(st_length(ep_reseau.geometrie)) as total FROM eclairage.ep_reseau group by commune) tot -- somme des longueurs de l'ensemble des réseaux de la commune
    GROUP BY r.commune, r.type_reseau, r.qualglocxy, tot.total
    ORDER BY r.commune, r.qualglocxy;
    Les valeurs retournées ne sont pas cohérentes, mon dénominateur (longueur total des réseaux de la commune) étant plus faible que mon numérateur . J'ai fais plusieurs test mais sans succès et tournant en rond, je dirais pas non à un petit coup de main

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Pouvez vous décrire vos tables sous forme DDL (CREATE TABLE) ?

    Ceci pour pouvoir vous aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Déjà je la récrirait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT r.commune, --commune
           r.type_reseau, --  type de réseau
           r.qualglocxy AS classe_precision, -- précision geoloc (A,B,C)
           count(r.qualglocxy) AS nombre, 
           SUM(st_length(r.geometrie)) AS m_lineaire, --longueur réseau
           100.0 * SUM(st_length(r.geometrie)) / 
              (SELECT SUM(st_length(ep_reseau.geometrie)) AS total
               FROM   eclairage.ep_reseau AS T
               WHERE  T.commune = RADIANS.commune) AS pourcentage
    FROM eclairage.ep_reseau r
    GROUP BY r.commune, 
             r.type_reseau, 
             r.qualglocxy, 
             tot.total;
    mais ce serait mille fois plus performant avec des fonctions fenêtrées....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Quelque chose comme :

    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
    WITH 
    T_STATS AS
    (
    SELECT r.commune, --commune
           r.type_reseau, --  type de réseau
           r.qualglocxy AS classe_precision, -- précision geoloc (A,B,C)
           count(r.qualglocxy) AS nombre, 
           SUM(st_length(r.geometrie)) AS m_lineaire_reseau, --longueur réseau
           SUM(SUM(st_length(r.geometrie))) OVER(PARTITION BY commune) AS m_lineaire_commune --longueur commune
    FROM   eclairage.ep_reseau r
    GROUP  BY r.commune, 
              r.type_reseau, 
              r.qualglocxy
    )
    SELECT *, 100.0 * m_lineaire_reseau / m_lineaire_commune AS POURCENT
    FROM   T_STATS;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Oui alors il n'y a qu'une seule table, importée depuis un logiciel sig (avec un milliard de colonnes ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE ep_reseau 
    (
        id_res int,
        commune varchar(255), -- nom de la commune
        type_reseau varchar(255), -- catégorie réseau (aérien, souterrain)
        qualglocxy varchar(1), --classe de précision de la géoloc
        geometrie geom, 
        CONSTRAINT ep_reseau_PK PRIMARY KEY(id_res)
    );
    Je souhaiterai obtenir un résultat tel que :
    Nom : Capture d'écran Deepin_zone de sélection _20200408104802.png
Affichages : 197
Taille : 22,7 KoNom : Capture d'écran Deepin_zone de sélection _20200408104802.png
Affichages : 197
Taille : 22,7 Ko

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Quelque chose comme :

    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
    WITH 
    T_STATS AS
    (
    SELECT r.commune, --commune
           r.type_reseau, --  type de réseau
           r.qualglocxy AS classe_precision, -- précision geoloc (A,B,C)
           count(r.qualglocxy) AS nombre, 
           SUM(st_length(r.geometrie)) AS m_lineaire_reseau, --longueur réseau
           SUM(SUM(st_length(r.geometrie))) OVER(PARTITION BY commune) AS m_lineaire_commune --longueur commune
    FROM   eclairage.ep_reseau r
    GROUP  BY r.commune, 
              r.type_reseau, 
              r.qualglocxy
    )
    SELECT *, 100.0 * m_lineaire_reseau / m_lineaire_commune AS POURCENT
    FROM   T_STATS;
    A +
    Je vais tester, si je me souviens bien le "WITH" permet de créer une requête que l'on peut réexploiter juste après non ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 37
    Points
    37
    Par défaut
    La solution avec With fonctionne ! merci

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Solevita Voir le message
    Je vais tester, si je me souviens bien le "WITH" permet de créer une requête que l'on peut réexploiter juste après non ?
    WITH permet de factoriser des tables dérivées (sous requêtes) que l'on peut reprendre dans la clause FROM....
    À me lire : https://sqlpro.developpez.com/cours/...cursives/#LIII

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [AC-2003] problème de produit pourcentage dans une requête
    Par hocine dans le forum IHM
    Réponses: 2
    Dernier message: 22/03/2010, 11h03
  2. erreur3073 Problème requête
    Par amel123456789 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2004, 10h15
  3. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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