Discussion: SQL et MAX, pff!

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    mars 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : mars 2015
    Messages : 27
    Points : 23
    Points
    23

    Par défaut SQL et MAX, pff!

    Bonjour,

    Un truc idiot mais j'ai une table ou pour un article j'ai plusieurs date par mois avec un prix. Je voudrai le MAX de chaque mois.
    Vous avez 1 h

    Table de départ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Article    Date      Prix
    A           20170101      10  
    A           20170110       8
    A           20170205       11
    A           20170212       5
    B           20170101       22
    B           20170205       40
    B           20170222       35
    B           20170225       21
    Résultat attendu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Article    Date      Prix
    A           20170110       8
    A           20170212       5
    B           20170101       22
    B           20170225       21

    Vous avez 1 h
    Sinon ça peut attendre lundi, je suis cool!

  2. #2
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    octobre 2006
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : octobre 2006
    Messages : 867
    Points : 1 795
    Points
    1 795

    Par défaut

    Bonjour

    essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select article, month(madate), max(zone)
    from matable
    group by article, month(madate)

  3. #3
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 965
    Points : 6 524
    Points
    6 524
    Billets dans le blog
    1

    Par défaut

    Attention, la requête qui précède ne fonctionnera que s'il n'y a qu'une seule année

    Voici une possibilité si plusieurs années :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT YEAR(MADATE) !! '-' !! RIGHT(DIGITS(MONTH(MADATE)), 2)    
         , MAX(MONPRIX)                                                 
    FROM MATABLE
    GROUP BY YEAR(MADATE) !! '-' !! RIGHT(DIGITS(MONTH(MADATE)), 2)

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

    Informations forums :
    Inscription : août 2008
    Messages : 2 600
    Points : 5 016
    Points
    5 016

    Par défaut

    D'après l'exemple, ça n'a pas l'air d'être le MAX, mais plutôt conserver la ligne de date maximale par mois.

    Par exemple, avec rank ou row_number (en fonction de la gestion des ex aequo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rank () over(partition by article, YEAR(MADATE) !! '-' !! RIGHT(DIGITS(MONTH(MADATE)), 2) order by MADATE desc) as rn
    Puis filtrer sur rn = 1

  5. #5
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 965
    Points : 6 524
    Points
    6 524
    Billets dans le blog
    1

    Par défaut

    S'il s'agit de trouver la ligne la plus récente, j'ai justement fait un article dans mon blog sur ce sujet

    https://www.developpez.net/forums/bl...-escartefigue/

    On ne peut pas se tromper, c'est le seul article de mon blog

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    mars 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : mars 2015
    Messages : 27
    Points : 23
    Points
    23

    Par défaut

    Merci pour vos réponses qui m'ont aidé à pondre ma solution. Aussi un petit retour s'impose
    J'utilise dans la selection les zone de rupture avec un MAX sur la date(DATE8=YYYYMMJJ) dans le SELECT.
    Après le GROUP BY se fait sur la DATE mais sur 6 (YYYYMM). Le MAX du HAVING me permet de sélectionner simplement le mois(facultatif)
    Je l'encapsules par la même table, avec mes CLES en rupture dans le IN pour récupérer toutes mes informations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * FROM TABLE WHERE
    CRITERE=100 AND (CLE1, CLE2, DATE8) 
    IN
    ) 
    SELECT CLE1, CLE2, MAX(DATE8) FROM TABLE
    WHERE CRITERE=100 GROUP BY CLE1, CLE2, SUBSTR(DATE8, 1, 6)        
    HAVING MAX(ODFVDT)>20170900 
    )
    J’espère avoir été clair.

    Merci encore pour l'article, je vais me le lire tranquille!

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    mars 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : mars 2015
    Messages : 27
    Points : 23
    Points
    23

    Par défaut

    J'ai oublié un truc important , le DISTINCT; histoire d"éviter les doublons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT CLE1,CLE2, Z1, Z2... FROM TABLE WHERE
    CRITERE=100 AND (CLE1, CLE2, DATE8) 
    IN
    ) 
    SELECT CLE1, CLE2, MAX(DATE8) FROM TABLE
    WHERE CRITERE=100 GROUP BY CLE1, CLE2, SUBSTR(DATE8, 1, 6)        
    HAVING MAX(ODFVDT)>20170900 
    )

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

Discussions similaires

  1. [VB6]Requete sql access:max (date and time)
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 05/06/2006, 09h42
  2. SQL et MAX(count(*))
    Par zouaoui dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/05/2006, 13h15
  3. sql nombre max de table
    Par laurencin dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 04/04/2006, 18h37
  4. sql server max concurrent connections = 1 !!!!!
    Par zeavan dans le forum MS SQL-Server
    Réponses: 1
    Dernier message: 21/03/2006, 14h00
  5. SQL - Regroupement & Max(UneDate)
    Par ChrOnOs83 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/12/2005, 17h02

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