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

Développement SQL Server Discussion :

GROUP BY max(date)


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2008
    Messages : 272
    Points : 114
    Points
    114
    Par défaut GROUP BY max(date)
    Bonjour,

    Un tout petit problème pour lequel je buche un peu :

    J'aimerais sortir le prix d'un article pour lequel la date est la plus récente.

    Voici ma requête :

    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
    	pa_article, 
    	MAX(pa_date) as datePrix,
    	PA_PrixBrut
    FROM 
    	PrixArt INNER JOIN articles ON AR_Code = PA_Article 
    WHERE
    	AR_Actif = 1
    	and left(ar_code, 4) IN('3000','3010','3020','3300','3310','3320','3330','3400','3410','3420')
    	and AR_Code like '%D%'
    	and PA_Monnaie = 'CHF'
    GROUP BY PA_Article
    ORDER BY
    	pa_article
    Telle qu'elle est ici la requête me renvoie évidemment plusieurs lignes par article or je n'aimerais que la ligne pour laquelle la date est la plus récente. Je ne sais pas comment tourner mon group by.

    Pourriez-vous éclairer ma lanterne?

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    A première vue (comprendre que ce n'est probablement pas la manière optimale), je tenterais quelque chose dans ce goût-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH T (PA_ARTICLE, PA_DATE) 
    AS (
         SELECT
                     PA_ARTICLE,
                     MAX(PA_DATE)
         FROM
                      PRIXARTICLE
         GROUP BY
                     PA_ARTICLE
    )
    Avec la CTE ci-dessus, faites une jointure avec votre table PrixArticle. De cette manière, vous n'aurez que les prix les plus récents.

    N.B. : Votre requête, telle que vous la montrez, devrait renvoyer une erreur car la colonne PA_PRIXBRUT ne fait pas partie de la clause GROUP BY et elle ne subit aucune fonction d’agrégation non plus.

    En espérant avoir aidé.
    Kropernic

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Au passage prenez l'habitude de préciser le schéma de vos table.

    En l'occurrence ici dbo pour votre base (qui est une base Ligne 100 si je ne m'abuse).
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Citation Envoyé par funkyjul Voir le message
    Telle qu'elle est ici la requête me renvoie évidemment plusieurs lignes par article
    Elle devrait surtout retourner une erreur, avoir des colonnes dans le SELECT qui ne sont ni agrégées ni dans le GROUP BY, c'est interdit par SQL-Server.

    Si vous êtes au moins en version 2005 je vous invite à utiliser les fonctions de fenêtrage :
    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 Req (pa_article, pa_date, PA_PrixBrut, rn) as
    (
        SELECT PA.pa_article, PA.pa_date, PA.PA_PrixBrut
             , row_number() over(partition by PA.pa_article order by PA.pa_date desc)
          FROM dbo.PrixArt  AS PA
    INNER JOIN dbo.Articles AS AR
            ON AR.AR_Code = PA.PA_Article 
         WHERE AR.AR_Actif = 1
           AND LEFT(AR.ar_code, 4) IN ('3000', '3010', '3020', '3300', '3310', '3320', '3330', '3400', '3410', '3420')
           AND AR.AR_Code LIKE '%D%'
           AND PA.PA_Monnaie = 'CHF'
    )
    SELECT pa_article, pa_date, PA_PrixBrut
      FROM Req
     WHERE rn = 1;

  5. #5
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Côté optimisation, vous pouvez ajouter une colonne calculé LEFT(ar_code, 4) à la table Articles puis l'indexée.
    Etienne ZINZINDOHOUE
    Billets-Articles

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2008
    Messages : 272
    Points : 114
    Points
    114
    Par défaut
    Merci pour vos réponses, je n'ai malheureusement pas eu le temps de les consulter en détails (grosse grosse bourre au boulot).

    Je regarderai ça je l'espère cet après-midi et vous donnerai bien sur des news.

    Et effectivement la requête telle quelle me retourne une erreur du groupe by (manque pa_prixBrut)

Discussions similaires

  1. mysql max date group by
    Par legend79 dans le forum Requêtes
    Réponses: 18
    Dernier message: 10/04/2012, 15h44
  2. Max Date et Group by
    Par Jackola dans le forum SQL
    Réponses: 2
    Dernier message: 30/11/2010, 15h37
  3. Select sum(Poids) sur max(date) group by adr
    Par olibara dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/04/2009, 19h12
  4. Somme Group by et Max date
    Par mamiberkof dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/04/2008, 17h48
  5. [SQL2005] group by et max(date)
    Par BOUBOU81 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/12/2006, 17h54

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