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

Requêtes PostgreSQL Discussion :

Problème group by


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Problème group by
    Bonjour,

    J'ai une erreur avec cette requête à cause du group by et je n'arrive pas à le résoudre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select coo_trk_id, coo_time, coo_length, min(ST_Distance(
      geography(st_transform(coo_2d,4326)),
      ST_GeographyFromText('POINT(3.075206 50.369314)'))) as distance
    from coordinates, track
    WHERE coo_trk_id=trk_id AND trk_status IN (0,4) AND trk_veh_id=1
    and st_contains(GeomFromText('POLYGON((2.79271955988 50.1891338198, 3.35769244012 50.1891338198, 
        3.35769244012 50.5494941802, 2.79271955988 50.5494941802, 2.79271955988 50.1891338198))',4326), coo_2d)
    group by coo_trk_id
    order by distance
    En faite, je souhaiterais récupérer la distance minimale par trajet (coo_trk_id) ainsi que coo_time et coo_length. L'erreur est la suivante:

    ERROR: column "coordinates.coo_time" must appear in the GROUP BY clause or be used in an aggregate function
    LINE 1: select coo_trk_id, coo_time, coo_length, min(ST_Distance(
    Si quelqu'un à une piste, merci de me l'indiquer.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Lorsque l'on utilise un group by, toutes les colonnes présentes dans la clause SELECT doivent être présente dans la clause GROUP BY ou encadrée d'une fonction d’agrégation (sum, min, ...)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci,

    J'avais bien compris mais je ne sais pas comment résoudre cela. Il doit exister une solution non?

  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 772
    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 772
    Points : 52 729
    Points
    52 729
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT coo_trk_id, coo_time, coo_length
           min(ST_Distance(geography(st_transform(coo_2d,4326)), ST_GeographyFromText('POINT(3.075206 50.369314)'))) AS distance
    FROM   coordinates, track
    WHERE  coo_trk_id=trk_id 
      AND  trk_status IN (0,4) 
      AND  trk_veh_id=1
      AND st_contains(GeomFromText('POLYGON((2.79271955988 50.1891338198, 
                                             3.35769244012 50.1891338198, 
                                             3.35769244012 50.5494941802, 
                                             2.79271955988 50.5494941802, 
                                             2.79271955988 50.1891338198))',4326), coo_2d)
    GROUP BY coo_trk_id, coo_time, coo_length, 
    ORDER BY distance;
    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
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    La solution a été indiquée : il vous faut rajouter dans votre GROUP BY toutes les colonnes (hors fonctions d'aggrégat) citées dans la clause SELECT.

    Ou alors je n'ai pas bien compris votre besoin

    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Non j'ai déjà essayé de rajouter les colonnes coo_time et coo_length dans le group by mais le résultat de la requête n'est pas celui que j'attends. Cependant j'ai trouvé la solution sur un autre forum: il faut utiliser le fenêtrage. La requête qui donne le résultat que je veux est la suivante:

    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
    WITH TT (coo_trk_id, coo_time, coo_length, distance, R) AS (
    SELECT coo_trk_id, coo_time, coo_length,  (ST_Distance(
      geography(st_transform(coo_2d,4326)),
      ST_GeographyFromText('POINT(3.075206 50.369314)'))), ROW_NUMBER() OVER(PARTITION BY coo_trk_id ORDER BY (ST_Distance(
      geography(st_transform(coo_2d,4326)),
      ST_GeographyFromText('POINT(3.075206 50.369314)'))) asc)
    FROM coordinates, track
    WHERE coo_trk_id=trk_id AND trk_status IN (0,4) AND trk_veh_id=1
    and st_contains(GeomFromText('POLYGON((2.79271955988 50.1891338198, 3.35769244012 50.1891338198, 
        3.35769244012 50.5494941802, 2.79271955988 50.5494941802, 2.79271955988 50.1891338198))',4326), coo_2d)
    )
    SELECT coo_trk_id, coo_time, coo_length, distance
    FROM TT
    WHERE R = 1
    order by distance;
    Merci en tout cas.

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

Discussions similaires

  1. Problème Group by
    Par tollaire dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/08/2007, 09h51
  2. SharePoint 2007 - Problème groupes et permissions
    Par Najla dans le forum SharePoint
    Réponses: 3
    Dernier message: 20/03/2007, 22h42
  3. Problème group by
    Par nellynew dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/01/2007, 15h28
  4. [SQL] Problème group by sur view
    Par helene34 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2007, 08h25
  5. Problème Group By
    Par Fishes83 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/01/2007, 13h52

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