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 :

Requête avec la valeur MAX


Sujet :

Développement SQL Server

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut Requête avec la valeur MAX
    Bonjour à tous,

    je me permet de venir vers vous pour une requête SQL (sqlserver) et le option MAX.

    je dispose aujourd'hui d'une requête, qui liste le nombre de produit dans une année.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    SELECT distinct
    E.numero
           G.codeCompte AS comptegeneral,
           G.Caption AS libellecompte,
           S.code AS SECTION,
      --    (ltrim(rtrim(LEFT(E.Caption,7))) )  AS libelle,
    	--   CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))),
    	--   len(ltrim(rtrim(LEFT(E.Caption,7)))),
    	   case 
    	   WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 0 then ltrim(rtrim(LEFT(E.Caption,7)))
    	   WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 6 then SUBSTRING(ltrim(rtrim(LEFT(E.Caption,7))),1, CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7))))-1 )
    	   else
    	   ltrim(rtrim(LEFT(E.Caption,7))) end as libelle,
     
           TP.Caption AS societe,
           PA1.Caption AS marque,
           PA2.Caption AS Departement,
           PA3.Caption AS produit,
           PA4.Caption AS canal,
           PA5.Caption AS lieu
    FROM TECRITUREANALYTIQUE A
    INNER JOIN TPIECEANALYTIQUE P ON P.oid=A.oidpieceAnalytique
    INNER JOIN TECRITURE E ON E.oid=P.oidecriture
    INNER JOIN TCOMPTEGENERAL G ON G.oid=E.oidcompteGeneral
    INNER JOIN TPIECE P1 ON P1.oid=E.oidpiece
    INNER JOIN TPOINTANALYTIQUE PA ON PA.oid=A.oidpointAnalytique
    INNER JOIN TSECTIONANALYTIQUE S ON S.oid=PA.oidSectionAnalytique
    INNER JOIN TDBFPERIMETREPARTAGE TP ON TP.oid=A.oidShare
    INNER JOIN TCONSTITUTIONSECTION CS1 ON CS1.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS2 ON CS2.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS3 ON CS3.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS4 ON CS4.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS5 ON CS5.oidSectionAnalytique=S.oid
    INNER JOIN TPOSITIONANALYTIQUE PA1 ON PA1.oid=CS1.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA2 ON PA2.oid=CS2.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA3 ON PA3.oid=CS3.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA4 ON PA4.oid=CS4.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA5 ON PA5.oid=CS5.oidPositionAnalytique
    WHERE CS1.numero=1
      AND CS2.numero=2
      AND CS3.numero=3
      AND CS4.numero=4
      AND CS5.numero=5
      AND E.oidShare in
        (SELECT oid
         FROM TDBFPERIMETREPARTAGE
         WHERE Caption= 'MA')
      AND YEAR(eDate) IN (annee)
      AND eDate >='datedebut'
      AND eDate <= 'datefin'
     
      AND G.codeCompte IN ('70721000','70721005','70710000','70770000')
      order by  societe,lieu, Departement,produit,canal,comptegeneral,SECTION
    Champs: un extrait pour exemple

    numero comptegeneral libellecompte SECTION libelle societe marque Departement produit canal lieu
    11399185 70721005 VENTE YY 122913007 924356 MA XXXXXXX YY YY ZZZZ city
    11575359 70721005 VENTE YY 122913007 924356 MA XXXXXXX YY YY ZZZZ city
    11381514 70721005 VENTE YY 122910107 924356 MA XXXXXXX YY YY OOOOO city
    11399121 70721005 VENTE YY 122910107 924356 MA XXXXXXX YY YY OOOOO city
    11575370 70721005 VENTE YY 122910107 924356 MA XXXXXXX YY YY OOOOO city
    11575381 70721005 VENTE YY 122910107 924356 MA XXXXXXX YY YY OOOOO city
    11575392 70721005 VENTE YY 122910107 924356 MA XXXXXXX YY YY OOOOO city

    *idEcriture est le champs automatique qui s’incrémente tout seul dans la base.

    Il est possible qu'un produit ai été enregistré dans la mauvaise section et donc qu'il y a un 2ème enregistrement, un enregistrement qui est présent dans la mauvaise section et un autre dans la bonne section.(dans exemple ci-dessous)


    je voudrais arriver a faire avec une requête SQL (c'est peut être pas avec la valeur max), de lister de produit mais uniquement avec IDEcriture à la valeur MAX (qui correspond au dernier enregistrement)

    Est-ce réalisable ? Faut-il partir avec Option MAX ou bien autre requête?

    Merci d'avance vos explications et votre aide

    guigui69

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    re,

    j'ai mal expliqué un élément:

    lister les produits mais uniquement avec IDEcriture à la valeur MAX (qui correspond au dernier enregistrement) par rapport au libellé dans 'exemple 924356 :

    id comptegeneral SECTION libelle societe marque Departement produit canal lieu
    11575359 70721005 122913007 924356 MA XXXX A B toto Paris
    11575392 70721005 122910107 924356 MA XXXX A B tata Paris

    Dans exemple ci-dessus c'est un même produit mais enregistré dans la mauvaise Section ( mauvais canal aussi) et donc je ne voudrais voir uniquement la 2ème ligne car celle qui a ID plus grand (donc dernier enregistrement)

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    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 : 10 637
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Comment extraire la valeur la plus petite, la plus grande, la plus récente, la plus ancienne est un sujet archi récurrent.
    C'est la raison pour laquelle je lui ai consacré un billet de blog ici

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    La requête que j'ai réalisé pour l'instant est la suivante

    Cela a l'air de fonctionner mais il surement plus simple,non?

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    SELECT distinct 
    --E.numero as id,
           G.codeCompte AS comptegeneral,
           G.Caption AS libellecompte,
         S.code AS SECTION,
      --    (ltrim(rtrim(LEFT(E.Caption,7))) )  AS libelle,
    	--   CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))),
    	--   len(ltrim(rtrim(LEFT(E.Caption,7)))),
    	   case 
    	  WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 0 then ltrim(rtrim(LEFT(E.Caption,7)))
       WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 6 then SUBSTRING(ltrim(rtrim(LEFT(E.Caption,7))),1, CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7))))-1 )
    	   else
       ltrim(rtrim(LEFT(E.Caption,7))) end as libelle,
     
           TP.Caption AS societe,
           PA1.Caption AS marque,
           PA2.Caption AS Departement,
           PA3.Caption AS produit,
         PA4.Caption AS canal,
           PA5.Caption AS lieu
    FROM TECRITUREANALYTIQUE A
    INNER JOIN TPIECEANALYTIQUE P ON P.oid=A.oidpieceAnalytique
    INNER JOIN TECRITURE E ON E.oid=P.oidecriture
    INNER JOIN TCOMPTEGENERAL G ON G.oid=E.oidcompteGeneral
    INNER JOIN TPIECE P1 ON P1.oid=E.oidpiece
    INNER JOIN TPOINTANALYTIQUE PA ON PA.oid=A.oidpointAnalytique
    INNER JOIN TSECTIONANALYTIQUE S ON S.oid=PA.oidSectionAnalytique
    INNER JOIN TDBFPERIMETREPARTAGE TP ON TP.oid=A.oidShare
    INNER JOIN TCONSTITUTIONSECTION CS1 ON CS1.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS2 ON CS2.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS3 ON CS3.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS4 ON CS4.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS5 ON CS5.oidSectionAnalytique=S.oid
    INNER JOIN TPOSITIONANALYTIQUE PA1 ON PA1.oid=CS1.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA2 ON PA2.oid=CS2.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA3 ON PA3.oid=CS3.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA4 ON PA4.oid=CS4.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA5 ON PA5.oid=CS5.oidPositionAnalytique
    WHERE CS1.numero=1
      AND CS2.numero=2
      AND CS3.numero=3
       AND CS4.numero=4
      AND CS5.numero=5
    AND E.numero IN (
    SELECT 
    max(E.numero) as id
      --     G.codeCompte AS comptegeneral,
         --  G.Caption AS libellecompte,
     ---      S.code AS SECTION,
      --    (ltrim(rtrim(LEFT(E.Caption,7))) )  AS libelle,
    	--   CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))),
    	--   len(ltrim(rtrim(LEFT(E.Caption,7)))),
    	--   case 
    	--   WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 0 then ltrim(rtrim(LEFT(E.Caption,7)))
    --	   WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 6 then SUBSTRING(ltrim(rtrim(LEFT(E.Caption,7))),1, CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7))))-1 )
    --	   else
    --	   ltrim(rtrim(LEFT(E.Caption,7))) end as libelle,
     
     --      TP.Caption AS societe,
      --     PA1.Caption AS marque,
      --     PA2.Caption AS Departement,
      --     PA3.Caption AS produit,
     ---      PA4.Caption AS canal,
      --     PA5.Caption AS lieu
    FROM TECRITUREANALYTIQUE A
    INNER JOIN TPIECEANALYTIQUE P ON P.oid=A.oidpieceAnalytique
    INNER JOIN TECRITURE E ON E.oid=P.oidecriture
    INNER JOIN TCOMPTEGENERAL G ON G.oid=E.oidcompteGeneral
    INNER JOIN TPIECE P1 ON P1.oid=E.oidpiece
    INNER JOIN TPOINTANALYTIQUE PA ON PA.oid=A.oidpointAnalytique
    INNER JOIN TSECTIONANALYTIQUE S ON S.oid=PA.oidSectionAnalytique
    INNER JOIN TDBFPERIMETREPARTAGE TP ON TP.oid=A.oidShare
    INNER JOIN TCONSTITUTIONSECTION CS1 ON CS1.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS2 ON CS2.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS3 ON CS3.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS4 ON CS4.oidSectionAnalytique=S.oid
    INNER JOIN TCONSTITUTIONSECTION CS5 ON CS5.oidSectionAnalytique=S.oid
    INNER JOIN TPOSITIONANALYTIQUE PA1 ON PA1.oid=CS1.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA2 ON PA2.oid=CS2.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA3 ON PA3.oid=CS3.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA4 ON PA4.oid=CS4.oidPositionAnalytique
    INNER JOIN TPOSITIONANALYTIQUE PA5 ON PA5.oid=CS5.oidPositionAnalytique
    WHERE CS1.numero=1
      AND CS2.numero=2
      AND CS3.numero=3
       AND CS4.numero=4
      AND CS5.numero=5
      AND E.oidShare in
        (SELECT oid
         FROM TDBFPERIMETREPARTAGE
         WHERE Caption= 'MA')
      AND YEAR(eDate) IN (2021)
      AND eDate >='20210101'
      AND eDate <= '20210630'
    --  and ltrim(rtrim(LEFT(E.Caption,7)))='924356'
      AND G.codeCompte IN ('70721000','70721005','70710000','70770000')
      group by TP.Caption,PA1.Caption, PA2.Caption,PA3.Caption,G.codeCompte,	   case 
    	   WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 0 then ltrim(rtrim(LEFT(E.Caption,7)))
    	   WHEN CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7)))) = 6 then SUBSTRING(ltrim(rtrim(LEFT(E.Caption,7))),1, CHARINDEX(' ', ltrim(rtrim(LEFT(E.Caption,7))))-1 )
    	   else
    	   ltrim(rtrim(LEFT(E.Caption,7))) end)

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    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 : 10 637
    Billets dans le blog
    10
    Par défaut
    Cette méthode correspond à la première proposée dans mon blog.
    Comme la fonction MAX()renvoie une valeur unique, vous pouvez remplacer l'opérateur IN par =.

    La requête n'est pas facile à lire car mal indentée, mais en la remettant en forme, si je n'ai pas fait d'erreur, le regroupement effectué dans la requête corrélée introduite par AND E.oidShare in (SELECT oid... est inutile. Cette même requête aurait avantage à être remplacée par un test d'existence (EXISTS) plutôt qu'un IN.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2009, 11h49
  2. [EJBQL] Requête avec une valeur constante dans les champs résultat
    Par adamo901 dans le forum Java EE
    Réponses: 1
    Dernier message: 13/04/2009, 00h32
  3. UPDATE avec une valeur MAX
    Par Bobtop dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/06/2006, 12h08
  4. Requête avec sélection sur MAX et Rupture par Service
    Par Kmiecik Sigismond dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/04/2006, 14h00
  5. [Débutant / SQL] Requête avec la fonction MAX
    Par bugmenot dans le forum Access
    Réponses: 3
    Dernier message: 14/04/2006, 10h43

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