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 :

Comparaison dans une même table des montants avec %


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut Comparaison dans une même table des montants avec %
    Bonjour à tous,[

    Je commence avec SQL et je dois extraire de la base des "faux doublons" :
    Je dois extraire des factures pour une même personne, pour un même numéro de facture avec un montant différent de 5%.

    Merci pour votre aide car je n'ai pas trouvé le moyen. Les factures sont dans la même table. J'ai commencé avec ceci pour extraire les doublons mais là je suis bloqué car se sont des " faux doublons" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT *
    FROM detect.facture_ps AS t1
    WHERE EXISTS
        (SELECT *
         FROM detect.facture_ps AS t2
    	WHERE t1.fect_idtech <> t2.fect_idtech 
    	AND t1.idfactpk = t2.idfactpk
    	AND t1.fk_idadh = t2.fk_idadh 
    	AND t1.datefact = t2.datefact 
    	AND t1.mttotalremlbfact = t2.mttotalremlbfact
        AND t1.mttotalremlbfact > 0
        )
    ORDER BY t1.idfactpk

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 763
    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 763
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Je ne comprends pas bien, dans l'énoncé tu parles de factures avec des montants différents, or tu construit ta jointure avec égalité sur le n° de facture et le montant.

    Comment peut on avoir 2 fois le même n° de facture dans une table facture (il faudrait joindre le MPD avec les index), et si vraiment présent 2 fois, n'y a -t- il pas un code genre annulation qui ferait que seule une des 2 est valide. Sinon je ne comprends pas les montants diiférents.

    Par ailleurs quelques remarques :

    - un distinct sur un select * ça va couter cher en tri ! est-ce vraiment utile, j'en doute
    - select * idem, as tu vraiment besoin de toutes les colonnes, transporter des données a aussi un cout, et on a rarement besoin de tout
    - en cas d'écart de montant, ne faut il pas comparer les éléments composants la facture (articles facturés, quantités, prestations annexes) pour expliquer les doublons (en conservant l'idée que seule une des 2 factures est valide, quelques explications sur ce point particulier sont nécessaires) ?

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    remplacer and t1.mttotalremlbfact = t2.mttotalremlbfact par :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    and (abs(t1.mttotalremlbfact - t2.mttotalremlbfact) / t1.mttotalremlbfact < .05 or abs(t1.mttotalremlbfact - t2.mttotalremlbfact) / t2.mttotalremlbfact < .05)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Bonjour StringBuilder,

    La comparaison est bien mais j'ai un problème avec des factures qui sont égales à 0.
    Il ne s'agit pas de facture comptable mais des factures provenant de professionnel de santé qui peuvent emmètre des montants à 0.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur SQL :
    ERREUR:  division par zéro

    Comment les exclure avant le calcul ?

    Merci

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    Rajouter un test sur la valeur zéro pour écarter du test les factures où t1 = 0 ou t2 = 0, et exclure les factures où t1 = 0 et t2 = 0.

    Je te laisse écrire seul cette partie, c'est trivial à écrire.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 763
    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 763
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Rajouter un test sur la valeur zéro pour écarter du test les factures où t1 = 0 ou t2 = 0, et exclure les factures où t1 = 0 et t2 = 0.

    Je te laisse écrire seul cette partie, c'est trivial à écrire.
    Désolé d'insister, mais pour ma part, les solutions techniques n'auront de sens que lorsque j'aurai compris le contexte, or, je ne comprends toujours pas comment on peut avoir 2 factures avec le même numéro d'une part, et qui plus est avec des montants différents d'autre part.

    Soit l'une des 2 est annulée auquel cas il n'y a plus de doublon, soit... bah j'en sais rien

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    Dans sa table, il y a :
    - fect_idtech : visiblement un identifiant "technique", certainement autoincrément, unique.
    - idfactpk : numéro de facture "humain" (par exemple, préfixé avec l'année et le jour, compteur par client, etc.), et contraitement au suffixe "pk", qui n'est pas une clé primaire (non unique)

    Pour des raisons X ou Y, plusieurs factures ont le même numéro "humain". Il faut voir ce numéro comme un commentaire, un simple texte. Le véritable identifiant est bien fect_idtech.

    Certains "doublons" (idfactpk identiques) semblent voulus (par exemple, la facture et ses avoirs auront par exemple le même numéro), mais d'autre ne le sont pas : saisie en doublon, erreur d'interface, etc.

    Il cherche donc à identifier les "doublons" pour lesquels le montant total est similaire (moins de 5% d'écart) afin de se pencher dessus pour déterminer s'il s'agit d'erreurs, ou de véritables factures différentes.

    Imagine un artisan qui utilise des talons numérotés pour ses factures, et que ces talons aillent de 1 à 1000.
    Si par hasard dans la même année, il fait plus de 1000 factures, son compteur de talons va boucler, et quand il va ressaisir ses factures dans son outil informatique, que sa femme lui a offert à Noël (ou que son comptable lui a obligé d'acheter), il va être dans le cas de notre ami.
    => Il faut donc, en présence de ces doublons, vérifier si ça correspond bien à des factures réelles ou des erreurs.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    C'est bien cela StringBuilder.

    En revanche peux-tu me dire comment extraire les factures à 0 car je suis un débutant et je ne vois pas comment je peux faire.

    Merci d'avance.

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 199
    Billets dans le blog
    1
    Par défaut
    Tu fais pas trop d'effort...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    and (
       (t1.mttotalremlbfact = 0 and mttotalremlbfact = 0)
       or
       (t1.mttotalremlbfact <> 0 and mttotalremlbfact <> 0 and (abs(t1.mttotalremlbfact - t2.mttotalremlbfact) / t1.mttotalremlbfact < .05 or abs(t1.mttotalremlbfact - t2.mttotalremlbfact) / t2.mttotalremlbfact < .05))

  10. #10
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Si la table est bien conçue, on ne peut pas trouver plus d'une facture avec même N° facture et même personne.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 038
    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 : 22 038
    Billets dans le blog
    6
    Par défaut
    Pour les factures en différences à 5% au maximum, faites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT *
    FROM detect.facture_ps AS t1
    WHERE EXISTS
        (SELECT *
         FROM detect.facture_ps AS t2
    	WHERE t1.fect_idtech <> t2.fect_idtech 
    	AND t1.idfactpk = t2.idfactpk
    	AND t1.fk_idadh = t2.fk_idadh 
    	AND t1.datefact = t2.datefact 
    	AND ABS(t1.mttotalremlbfact - t2.mttotalremlbfact) < 0.05 * ABS(t1.mttotalremlbfact - t2.mttotalremlbfact) / 2
        AND t1.mttotalremlbfact <> 0
        )
    ORDER BY t1.idfactpk
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Merci frédéric. Réponse parfaite.

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 763
    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 763
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par vpavince Voir le message
    Merci frédéric. Réponse parfaite.
    Il serait bien en ce cas d'approuver sa réponse en cliquant sur l'icone en bas de son message

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

Discussions similaires

  1. Champs identiques avec valeur différente where dans une même table
    Par Cyrus59 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/11/2014, 16h56
  2. Comparer des informations dans une même table
    Par foscor dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/10/2014, 16h59
  3. [AC-2010] Comparaison de données dans une même table
    Par ambact dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/10/2013, 12h13
  4. Réponses: 6
    Dernier message: 09/11/2012, 23h18
  5. Réponses: 2
    Dernier message: 16/05/2008, 14h43

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