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 :

Pourcentage d'égalité dans une requête, possible ?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Pourcentage d'égalité dans une requête, possible ?
    Bonjour

    N'étant pas un expert en SQL, et après des recherches ne m'aidant pas, je viens vers vous pour m'indiquer si ce que je veux faire est possible

    J'aimerais sortir le pourcentage d'égalité entre plusieurs commande.


    Base:
    J'ai une table Entete de commande avec le numéro de commande et une table détails qui contient la liste des articles avec une clé de correspondance sur le numéro de la commande.


    J'aimerais pouvoir faire ressortir un pourcentage d'égalité entre des commandes contenant les mêmes articles.


    Pour faire simple , par rapport à une commande , sortir toutes les commandes ayant au moins 70% d'article en commun

    et j'avoue ne pas trop savoir comment tourné ma requette pour faire ça



    Merci

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Jetez un œil du coté de la division relationnelle, votre problème s'en rapproche.

    Si vous rencontrez des difficultés pour l’implémentation, n'hésitez pas à nous montrer ce que vous avez fait afin que l'on puisse vous aider. Dans ce cas, postez un jeu d'essai sous forme de CREATE TABLE + INSERT INTO, et précisez votre SGBDR.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 10
    Points
    10
    Par défaut RESOLU
    OK merci , je vais potasser tout ça !


    j'ai trouver une solution un peu barbare , je fais un COUNT des références NOT IN (ma deuxieme requette) et je divise par rapport au nombre de d'article...

    mais je vais essayer de trouver mieux.


    Merci

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Bon, j'ai pensé a un solution, mais c'est degueu de chez degueu

    ok, donc on a
    entete (
    commande int
    )

    et

    detail (
    commande int,
    article int
    )


    Je simplifie un peu, c'est juste pour poser les bases.


    on va faire un truc pas beau, attention, protegez vous les n'oeils :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select A.commande, B.commande, sum(case when C.commande is null then 0 else 1 end)/count(*) 
    from detail A
    inner join entete B on A.commande <> B.commande 
    left outer join detail C on B.commande = C.commande and A.article = C.article
    group by A.commande, B.commande
    Je pense que ca marche... mais faut pas tester sur un gros volume, le produit cartesien peut faire tres tres mal !
    Ou alors, on limite a une commande en particulier.

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par Mister_bin Voir le message
    Bonjour
    [...]
    J'aimerais pouvoir faire ressortir un pourcentage d'égalité entre des commandes contenant les mêmes articles.
    Pour faire simple , par rapport à une commande , sortir toutes les commandes ayant au moins 70% d'article en commun
    et j'avoue ne pas trop savoir comment tourné ma requette pour faire ça
    Merci
    En fait l'énoncé simple peut recouvrer beaucoup de modes différents de calcul D'où questionnement !

    1. Faut-il faire du "ligne à ligne" dans l'identification ? On a souvent des commandes qui comportent plusieurs fois le même article, une commande avec 10 fois le même article est-elle à 100% en commun avec une autre commande n'ayant qu'une seule ligne de cet article, ou 10% (1 pour 10) ?

    2. Le % est-il pris sur l'ensemble des lignes des deux commandes être réciproque ? J'ai une commande avec 2 lignes : C1(ArtA, ArtB). Une 2ème commande avec 3 lignes : C2 (ArtA, ArtC, ArtD). On peut dire que C2 a une ligne en commun avec C1, ce qui ferait du point de vue C1 50% de similarité ... Mais du point de vue de C2 33% seulement. Ou d'un point de vue d'ensemble, sur 5 articles j'en ai 2 identiques, donc 40%. Bien sur on peut se poser la question en incluant le point 1 : C3 (ArtA, ArtA) par rapport à C2 : je peux dire que j'ai 100% (tous les articles de C3 sont dans C2), 50% (je n'ai dans C2 qu'une seule fois ArtA), 33% (je n'ai dans C3 qu'un seul des articles sur les 3 de C2), 40% (selon le point de vue d'ensemble : sur 5 articles, 2 sont présents dans les 2 commandes à la fois, en comptant ligne à ligne) ou 60% (sur 5 articles, 3 sont présents dans les 2 commande à la fois).

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci bsteevy et merci Rei Ichido


    Pour tes questions Rei ichido :

    Pour la première : la quantité n'est pas prise en compte, en faite le but de tout ça c'est d'éssayer de préparer des commandes multiple, un opérateur part , et en une commande je lui en fait faire 2 ou 3. C'est pour ça que la quantité de pièce n'est pas pris en compte, que tu ailles chercher 1 ou 10 pièces pour une même références , elles sont au même endroit.

    Pour la deuxième :

    J'ai dans l'idée de me fixer sur une commande et c'est par rapport à cette commande que je calcul les pourcentages d'égalité en vers les autres, j'ai limité à 3 commandes, une fois que j'ai trouvé 3 commandes ayant environ 80% d'égalité avec ma commande "maitre". je passe à la suivante etc. ça fonctionne en mélant SQL et algo mais le temps de traitement est phénoménale...

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Rei Ichido demandait également par rapport à quelle commande devait être calculé le pourcentage, ce qui changer de beaucoup la requête.

    Si vous avez une commande de référence, la requête de bstevy devrait être assez performante en l'adaptant, si toutefois vous disposez des bon index.
    Vous pouvez remplacer la jointure externe par une jointure externe.


    Sans doute sans impact sur les performances, vous pouvez aussi y remplacer sum(case when C.commande is null then 0 else 1 end)/count(*) par COUNT(C.commande)/count(*)En fonction de la réponse à la question de Rei Ichido vous pourrez peut être aussi supprimer la jointure sur la table des entêtes.

    Précisez le besoin. Pour trouver les commandes ayant un maximum d'articles en commun avec une commande de référence, vous pouvez simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  
    		A.commande
    	,	COUNT(*)  AS NbArticlesCommuns
    FROM	detail Ref
    INNER JOIN	detail A 
    	ON	A.commande <> Ref.commande 
    	AND A.article = Ref.article
    WHERE Ref.commande = 'xxx'
    GROUP BY A.commande
    ORDER BY 2 DESC

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Avec un PERCENT_RANK() ça devrait le faire...

    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/ * * * * *

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

Discussions similaires

  1. [AC-2007] Calcul de pourcentage dans une requête
    Par Nephyline dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 05/10/2009, 15h31
  2. Réponses: 4
    Dernier message: 30/10/2008, 11h50
  3. Réponses: 1
    Dernier message: 07/05/2008, 11h42
  4. Réponses: 7
    Dernier message: 08/02/2008, 10h35
  5. C'est possible dans une requête SELECT ?
    Par Kokito dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/04/2005, 16h59

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