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

Requêtes et SQL. Discussion :

Requete sur valeurs numériques répétées


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut Requete sur valeurs numériques répétées
    Bonsoir,

    Désolé pour le titre pas très explicite. En clair, j'ai à nouveau besoin d'aide...
    J'ai une question qui je l'espère vous paraitra toute bête, mais moi, je sèche...

    J'ai 2 tables :

    T_Clients

    - IdClient
    - NomClient
    - Adresse, etc...

    T_Commandes

    - IdCommande
    - IdClient
    - DateCommande
    - MontantCommande
    - DelaiPaiement
    - etc...

    1. Je voudrais pouvoir d'une requête identifier les clients qui n'ont jamais eu de commande d'un montant inférieur à une valeur donnée (disons 500, par exemple), entre 2 dates données.
    Je suis sûr qu'il y a une manière simple de faire, mais je trouve pas...

    2. Plus compliqué... Je voudrais identifier les clients qui ont eu au maximum une fois un délai de paiement supérieur à 10 jours entre 2 dates données.
    Là, par contre, je pense qu'il va falloir bidouiller ?...

    Merci d'avance pour vos conseils...

    BM

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Ta table commande n'a pas de numéro de commande , une clé primaire qui identifie chaque commande de façon unique ?

    Philippe

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Philippe JOCHMANS Voir le message
    Bonjour

    Ta table commande n'a pas de numéro de commande , une clé primaire qui identifie chaque commande de façon unique ?

    Philippe
    Si, bien sûr, j'ai oublié de la mentionner : champ IdCommande.
    Je rectifie.

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    Requête de non correspondance :
    Placer les 2 tables dans la requête.
    Placer les critères de date et de montant.
    Orienter la relation de clients vers commandes et ajouter le critère null dans une colonne idclient de la table commandes

    Pour la seconde avec une opération NB limitée à 1 et un délai >10 cela devrait marcher.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse, Chris.

    "Requête de non-correspondance", je ne connaissais pas.
    (je n'ai aucune connaissance théorique des SGBD, j'ai l'habitude de bidouiller avec un peu de logique et en général je m'en sors... )

    J'ai suivi tes instructions, jusqu'à "Orienter la relation de clients vers commandes".

    Après, "ajouter le critère null dans une colonne idclient de la table commandes", je ne vois pas bien.
    Si je marque la condition "Est Null" pour le champ T_Commandes.IdClient, la requête ne me donne aucun résultat. (par définition, il y a toujours une valeur dans ce champ !)
    Si j'enlève cette condition, le résultat me sort toutes les commandes d'un montant > 500, y compris celles de clients qui ont par ailleurs des commandes de moins de 500 sur la même période.

    Voici la traduction en SQL (les dates de début et de fin sont récupérées d'un formulaire qui permet de préciser la période d'intérêt) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Commandes.IdClient, T_Commandes.MontantCommande, T_Commandes.DateCommande
    FROM T_Clients LEFT JOIN T_Commandes ON T_Clients.IdClient = T_Commandes.IdClient
    WHERE (((T_Commandes.MontantCommande)>500) AND ((T_Commandes.DateCommandes) Between [Formulaires]![F_StatAnnuelle]![DateDeb] And [Formulaires]![F_StatAnnuelle]![DateFin]));
    Je vais continuer de chercher de mon côté, en creusant cette notion de non-correspondance, mais si tu as un petit coup de pouce à me donner, ce ne sera pas de refus !

    BM

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    C'est bon !

    Avec un papier et un crayon (irremplaçables ! ), un peu de réflexion et tes précieuses indications, j'ai réussi ma première question !

    J'ai un peu décomposé les étapes pour mon cerveau deux-temps :
    - une première requête qui me fait la liste de tous les clients qui ont fait au moins une commande sur la période donnée,
    - une deuxième requête qui me liste toutes les commandes < 500 (et non > 500 comme j'étais parti pour le faire initialement) sur la période
    - puis une 3e requête de non correspondance entre les résultats de ces 2 requêtes, qui me donne la liste des clients qui figurent dans la 1ère requête mais pas dans la 2e.

    Merci beaucoup Chris !

    Bon, je vais prendre le temps d'éliminer les bulles de champagne avant de me repencher sur ma 2e question avec tes indications.

    BM

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Hello Chris,

    Je reviens à la charge, car je comprends bien l'idée, mais j'ai un peu de mal à la traduire en syntaxe :

    Citation Envoyé par 78chris Voir le message
    Pour la seconde avec une opération NB limitée à 1 et un délai >10 cela devrait marcher.
    J'arrive d'une part à obtenir tous les client dont le délai de paiement est TOUJOURS inférieur à 10 jours, en utilisant le même raisonnement que pour le montant de commande

    J'arrive d'autre part à identifier tous ceux qui ont 1 délai de paiement > 10 jours, en multi-décomposant :
    - Requête sélectionnant toutes les commandes avec délai > 10 jours
    - Puis 2e requête qui compte dans cette première le nombre d'occurence par client (donc résultat de 1 à X)
    - Puis 3e requête qui sélectionne dans cette 2e les résultats égaux à 1

    Y'a surement moyen de faire bien plus simple, et d'avoir d'emblée tous les résultats qui correspondent à 0 ou 1 délai > 10 jours ? (au lieu d'avoir 0 d'un côté et 1 de l'autre)

    Mais bon, déjà, j'ai un résultat, je m'estime heureux.

    BM

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 785
    Points : 58 199
    Points
    58 199
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    2. Plus compliqué... Je voudrais identifier les clients qui ont eu au maximum une fois un délai de paiement supérieur à 10 jours entre 2 dates données.

    Une requête de sélection sur la table T_Commandes avec une seule colonne IdClient affichée avec deux critères : DelaiPaiement>10 puis DateCommande Entre [DateDebut] et [DateFin].

    Une deuxième reprenant la requête précédente avec jointure sur Client où tu ramènes les colonnes NomClient, adresse,… Tu cliques sur le bouton (∑) pour opérer le regroupement sur le client, puis tu rajoutes une colonne expr1 :Compte(*) avec le critère <=1

    à tester...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par f-leb Voir le message
    à tester...
    J'ai testé, et...

    Impossible d'avoir une fonction d'agrégat dans la clause GROUP BY (Count(*)).
    Bon, c'est pas grave : j'ai fait un truc compliqué, mais au final, j'arrive à avoir les infos que je veux.

    Merci à tous pour votre aide

    BM

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 785
    Points : 58 199
    Points
    58 199
    Billets dans le blog
    42
    Par défaut
    arf, j'ai juste oublié un truc...

    Dans la colonne avec Compte(*), mettre la ligne "Opération" avec la valeur "expression".

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Je n'ai plus de message d'erreur. Par contre, le résultat ne me parait pas cohérente : j'ai l'impression qu'il n'y a que ceux qui ont eu 1 fois un délai > 10 jours, mais que ceux qui n'en ont jamais eu n'apparaissent pas.

    Bon, te tracasse pas, f-leb, mon usine à gaz fonctionne (à sa manière, certes), c'est déjà bien

    Merci pour ta sollicitude !

  12. #12
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 785
    Points : 58 199
    Points
    58 199
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    dans ce cas pour ceux que ça intéresse, je propose une solution en deux temps…

    - une première requête qui rassemble les clients (les mauvais payeurs) qui, plus d’une fois, ont eu un délai de paiement supérieur à 10 jours pendant la période (le mois de février dans mon exemple) :


    Parmi les clients qui ont passé au moins une commande pendant cette période, éliminer les mauvais payeurs (non-correspondance) :

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Clair et limpide

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

Discussions similaires

  1. [XL-2003] problème sur valeur numérique
    Par Chicard dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/08/2011, 10h35
  2. [XL-2003] Test à effectuer sur valeurs numériques (débutant VBA..)
    Par Clipper24 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/07/2010, 12h25
  3. Requete sur valeur NULL
    Par LyLy_91 dans le forum Développement
    Réponses: 8
    Dernier message: 03/10/2007, 16h48
  4. Requete sur valeur NULL
    Par LyLy_91 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/10/2007, 16h48
  5. Réponses: 2
    Dernier message: 02/06/2007, 12h06

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