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

Langage SQL Discussion :

DISTINCT + WHERE + ORDER BY + LIMIT


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 6
    Points
    6
    Par défaut DISTINCT + WHERE + ORDER BY + LIMIT
    Bonjour à tous,

    J'ai une BDD Access avec une table (2_Offers_Configuration_Study) dans laquelle une colonne (Study_N°) contient des données de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RJ-00016
    RJ-00017
    RJ-00098
    Test
    Vérification Prix
    RJ-00125
    RJ-00126
    J'aimerais pouvoir directement via SQL obtenir la dernière valeur descendante d'un champ contenant des données numériques, j'ai essayé différentes syntaxes sans succès depuis quelques jours... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set enr = base.OpenRecordset("SELECT DISTINCT Study_N° FROM 2_Offers_Configuration_Study WHERE Study_N° LIKE 'RJ-%' ORDER BY DESC LIMIT 1", dbOpenDynaset)
    Ou
    Set enr = base.OpenRecordset("SELECT Study_N° FROM 2_Offers_Configuration_Study WHERE Study_N° = 'RJ%' GROUP BY Study_N° HAVING MAX(Study_N°)", dbOpenDynaset)
    Avez-vous des pistes, ou une solution pour réaliser cette requête ?

    Merci d'avance

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


    Tout simplement avec SELECT MAX(ma_colonne) ou MIN(ma_colonne) + une restriction permettant de filtrer la ou les valeurs recherchées (LIKE 'RJ%' par exemple)

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 135
    Points : 1 913
    Points
    1 913
    Par défaut
    Bonjour,

    C'est dans le ORDER BY qu'il faut "filtrer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT Study_N° FROM 2_Offers_Configuration_Study WHERE Study_N° LIKE 'RJ-%' ORDER BY ltrim(replace(Study_N°, 'RJ-', ' ')) DESC LIMIT 1

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    non : Sauf si la population de la table est très réduite, faire un DISITNCT inutile et couteux et utiliser la clause LIMIT avec un ORDER BY également inutile et couteux doit être remplacé par un select (min) comme indiqué précédemment.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    non : Sauf si la population de la table est très réduite, faire un DISITNCT inutile et couteux et utiliser la clause LIMIT avec un ORDER BY également inutile et couteux doit être remplacé par un select (min) comme indiqué précédemment.
    J'ai essayé différente manière, cependant, j'ai une erreur de type : élément non trouvé dans cette collection... J'ai vérifier mes données je ne comprends pas ce qu'il bloque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(Study_N°) FROM 2_Offers_Configuration_Study WHERE Study_N° = 'RJ-%'

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    C'est dans le ORDER BY qu'il faut "filtrer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT Study_N° FROM 2_Offers_Configuration_Study WHERE Study_N° LIKE 'RJ-%' ORDER BY ltrim(replace(Study_N°, 'RJ-', ' ')) DESC LIMIT 1
    Erreur de syntaxe dans la CLAUSE ORDER BY, je comprends le code mais je ne vois pas pourquoi le ORDER BY bloque...

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    C'est normal, il faut utiliser l'opérateur LIKE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MAX(Study_N°) 
    FROM 2_Offers_Configuration_Study 
    WHERE Study_N° LIKE 'RJ-%'

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    C'est normal, il faut utiliser l'opérateur LIKE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MAX(Study_N°) 
    FROM 2_Offers_Configuration_Study 
    WHERE Study_N° LIKE 'RJ-%'
    Je dois vraiment être une bille... pas de différence avec LIKE

    Voici mon code complet :
    Code VBA : 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
    Sub TestSQL()
     
      Dim base As Database
      Dim myDB, ImportChamp, ImportTable As String
      Dim enr As Recordset
     
    Worksheets("Settings").Range("C2:HK2000" & Dernligne).ClearContents
     
     
    '_____________Chemin BDD
        myDB = "T:\DataBase Brief\Brief-Customers.accdb"
     
    '_____________Connexion BDD
        Set base = DBEngine.OpenDatabase(myDB, False, True)
     
         Set enr = base.OpenRecordset("SELECT MAX(Study_N°) FROM 2_Offers_Configuration_Study WHERE Study_N° LIKE 'RJ-%'", dbOpenDynaset)
     
    i = 1
    While Not (enr.EOF) 'boucle sur les enregistrements
        With enr
            Worksheets("Settings").Cells(1 + i, 5) = .Fields("Study_N°")
        End With
        enr.MoveNext
        i = i + 1
    Wend
     
    enr.Close
    Set enr = Nothing
     
    End Sub


    Ma BDD:
    Pièce jointe 582896
    Images attachées Images attachées  

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Il faut certainement encadrer STUDY_N° de doubles quotes car cette colonne utilise des caractères spéciaux (pas top du reste...)
    Désolé, je n'y avais pas prêté attention, j'aurai pu le préciser dans ma réponse précédente

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Il faut certainement encadrer STUDY_N° de doubles quotes car cette colonne utilise des caractères spéciaux (pas top du reste...)
    Désolé, je n'y avais pas prêté attention, j'aurai pu le préciser dans ma réponse précédente
    Merci escartefigue pour ton aide.

    J'ai essayé cependant même soucis (élément non trouvé dans cette collection...), en allant + dans le détail je remarque que mon enr a bien trouvé une valeur cependant il me nomme la colonne Expr1000..., en cherchant il semblerait que la solution soit de mettre des [ ], mais cela ne change rien, même une simple formule ne fonctionne pas.

    Je crois que je vais abandonner mes recherches j'ai passé beaucoup trop de temps dessus.

    Code VBA : 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
    Sub TestSQL()
     
      Dim base As Database
      Dim myDB, ImportChamp, ImportTable As String
      Dim enr As Recordset
     
    Worksheets("Settings").Range("C2:HK2000").ClearContents
     
     
    '_____________Chemin BDD
        myDB = "T:\DataBase Brief\Brief-Customers.accdb"
     
    '_____________Connexion BDD
        Set base = DBEngine.OpenDatabase(myDB, False, True)
     
     
        'Set enr = base.OpenRecordset("SELECT Study FROM 2_Offers_Configuration_Study", dbOpenDynaset)
        'Set enr = base.OpenRecordset("SELECT LTRIM(REPLACE(Study, 'RJ-', '')) As Study FROM 2_Offers_Configuration_Study", dbOpenDynaset)
     
    Set enr = base.OpenRecordset("SELECT MAX([Study]) FROM 2_Offers_Configuration_Study", dbOpenDynaset)
     
    i = 1
    While Not (enr.EOF) 'boucle sur les enregistrements
        With enr
            Worksheets("Settings").Cells(1 + i, 5) = .Fields![Expr1000]
        End With
        enr.MoveNext
        i = i + 1
    Wend
     
    enr.Close
    Set enr = Nothing
     
    End Sub

    Nom : 2020-11-04_10h42_02.png
Affichages : 144
Taille : 31,1 Ko

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

Discussions similaires

  1. distinct et order by
    Par Shivan dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 27/04/2007, 11h15
  2. limite de select * from where titi in (,) limite à 1000 char
    Par chimiotheque dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/01/2007, 18h35
  3. Réponses: 5
    Dernier message: 10/07/2006, 13h05
  4. Problème de trie avec distinct et order ??
    Par matt210 dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/02/2006, 13h26
  5. Select distinct et order by
    Par arsgunner dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2004, 12h17

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