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 :

Recuperer la valeur avec la plus grande date


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut Recuperer la valeur avec la plus grande date
    Bonjour à tous,

    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
    15
    16
    17
    18
     
      SELECT "Societe" ,"Atelier", "tarif",MAX("date_debut")
      FROM (SELECT  
        tgempresa.razon as "Societe", 
        tgtaller.descrip as "Atelier",
     
      ttTarifa.Descrip as "tarif",     
      ttTarifaPrecioFecha.Tecnicidad as "M" ,          
    ttTarifaPrecioFecha.FechaDesde as "date_debut",
                ttTarifaPrecioFecha.PrecioHora as "prix"
    FROM ttTarifaPrecioFecha  
    inner join tgempresa on   ttTarifaPrecioFecha.emp = tgempresa.emp 
    inner join tgtaller on  ttTarifaPrecioFecha.emp = tgtaller.emp and ttTarifaPrecioFecha.taller = tgtaller.taller  
    INNER JOIN ttTarifa on ttTarifa.Codigo=ttTarifaPrecioFecha.Codigo  
                    WHERE                  
     ( ttTarifaPrecioFecha.Tecnicidad = 'M2' ) AND ttTarifaPrecioFecha.Codigo IN ('TCE','TCL','TGA')
      GROUP BY   tgempresa.razon, tgtaller.descrip,    ttTarifa.Descrip,   ttTarifaPrecioFecha.Tecnicidad,  ttTarifaPrecioFecha.FechaDesde,ttTarifaPrecioFecha.PrecioHora) requete1
       GROUP BY   "Societe" ,"Atelier","tarif","date_debut"
    Cette requete me remonte par societe, site, nom du tarif, date, le tarif.

    Mais je n'arrive pas dans cette requête à faire ressortir uniquement de dernier tarif.

    Explication:
    Societe1|Site1|tarif Normal|2007-01-13|10€
    Societe1|Site1|tarif Normal|2008-02-13|12€
    Societe1|Site1|tarif Normal|2009-03-13|15€
    Societe1|Site1|tarif Normal|2012-01-13|19€
    Societe1|Site1|tarif remise|2007-01-13|10€
    Societe1|Site1|tarif remise|2009-01-13|15€
    Societe1|Site1|tarif remise|2010-01-13|16€
    Societe1|Site1|tarif remise|2011-06-13|17€

    Je voudrait arriver à avoir ceci:
    Societe1|Site1|tarif Normal|2012-01-13|19€
    Societe1|Site1|tarif remise|2011-06-13|17€

    Je n'arrive pas à utiliser la commande MAX.

    Pourriez-vous m'indiquer mon erreur pour corriger ma requête

    merci d'avance

    guigui69

  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 902
    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 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Déjà votre requête est particulièrement mal écrite :
    • 1) supprimez les " parasites
    • 2) supprimez les ( ou ) inutiles
    • 3) utilisez des alias de table
    • 4) identez correctement votre requête
    • 5) supprimez les GROUP BY inutiles


    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
    SELECT Societe ,Atelier, tarif, MAX(date_debut)
    FROM   (SELECT G.razon AS Societe, 
                   T.descrip AS Atelier,
                   R.Descrip AS tarif,     
                   TPF.Tecnicidad AS M ,          
                   TPF.FechaDesde AS date_debut,
                   TPF.PrecioHora AS prix
            FROM   ttTarifaPrecioFecha AS TPF
                   INNER JOIN tgempresa AS G
                         ON  TPF.emp = G.emp 
                   INNER JOIN tgtaller AS T
                         ON  TPF.emp = T.emp 
                             AND TPF.taller = G.taller  
                   INNER JOIN ttTarifa AS R
                         ON R.Codigo=TPF.Codigo  
            WHERE  TPF.Tecnicidad = 'M2' 
              AND  TPF.Codigo IN ('TCE','TCL','TGA')) AS requete1
    GROUP BY Societe, Atelier, tarif, date_debut;
    Ensuite le résultat est normal puisqu'il y a des tarifs différents pour des dates différentes !

    Si vous voulez le tarif à la date la plus récente il vous faut faire une sous requête et éventuellement utiliser les fonctions de fenêtrage.

    Au passage utiliser la CTE serait plus lisible !

    Exemple :

    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
    WITH 
    requete1 AS 
    (SELECT G.razon AS Societe, 
            T.descrip AS Atelier,
            R.Descrip AS tarif,     
            TPF.Tecnicidad AS M ,          
            TPF.FechaDesde AS date_debut,
            TPF.PrecioHora AS prix
     FROM   ttTarifaPrecioFecha AS TPF
            INNER JOIN tgempresa AS G
                  ON TPF.emp = G.emp 
            INNER JOIN tgtaller AS T
                  ON TPF.emp = T.emp 
                     AND TPF.taller = G.taller  
            INNER JOIN ttTarifa AS R
                  ON R.Codigo=TPF.Codigo  
     WHERE  TPF.Tecnicidad = 'M2' 
       AND  TPF.Codigo IN ('TCE','TCL','TGA')),
    requete2 AS 
    (SELECT Societe ,Atelier, tarif, date_debut,
            RANK() OVER(PARTITION BY Societe ,Atelier ORDER BY date_debut) AS RANG 
     FROM   requete1)
    SELECT Societe ,Atelier, tarif, date_debut
    FROM   requete2
    WHERE  RANG = 1;
    A +

Discussions similaires

  1. Sélectionner une ligne par un ID avec la plus grande date
    Par lhonolulu dans le forum SAS Base
    Réponses: 5
    Dernier message: 03/06/2009, 17h47
  2. selection par la plus grande date d'une année
    Par Chicna dans le forum Langage SQL
    Réponses: 8
    Dernier message: 21/02/2007, 13h47
  3. Réponses: 2
    Dernier message: 20/02/2007, 10h29
  4. Requête qui va chercher la plus grande date
    Par charleshbo dans le forum Access
    Réponses: 3
    Dernier message: 03/05/2006, 14h43
  5. [SQL SERVER 2000] 2 plus grandes dates
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/04/2006, 10h17

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