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

SQL Firebird Discussion :

Probléme de requete avec calcul de taux


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut Probléme de requete avec calcul de taux
    Bonjour a tous

    je reviens encore le meme problème sous une autre forme

    j'ai 2 tables

    MAGAZIN(idmagazin, typemagazin, quartiermagazin, villemagazin)
    PRODUIT(idproduit, nomproduit, typroduit, Numeromagazin)

    la relation entre magazin et produit est de type 1;n (idmagazin, Numeromagazin)

    typemagazin peut prendre soit 'grossite' soit 'detaillant'
    typroduit peut prendre soit 'concurent' soit 'personnel'
    Mon premier problème était de rechercher :

    Taux de présence par ville pour les produit type 'personnel'.

    Ce probléme avait été resolu dans une autre discussion et j'avais eu pour reponse (de Barbibulle ) :

    SELECT m.villemagazin, count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso, count(DISTINCT m.idmagazin) nbr_total_magasin_meme_ceux_sans_produits
    FROM magazinm
    LEFT JOIN Produit p ON (p.numeromagazin = m.idmagazin) AND (p.typroduit ='Personel')
    GROUP BY m.villemagazin
    Le premier count compte le nombre de magasin ayant des produits de type 'personel' et le second count compte le nombre total de magasin (même ceux qui n'ont pas de produits).
    Maintenant je veux avoir
    1 le taux de présence pour tous les produits par ville
    2 le taux de présence par produits par ville

    voici ce que j'ai trouver pour la requete 1 en m'appuyant sur la reponse de Barbibulle es correcte ? car j'obtient les meme chiffres pour les deux count :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT m.villemagazin, p.nomproduit, 
    count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso, 
    count(DISTINCT m.idmagazin) nbr_total_magasin_meme_ceux_sans_produits
    FROM magazinm
    LEFT JOIN Produit p ON (p.numeromagazin = m.idmagazin) GROUP BY
     m.villemagazin, p.nomproduit
    j'ai encore besion d'aide
    Merci a tous

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    1 le taux de présence pour tous les produits par ville

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT m.villemagazin,  
    sum(case when (p.typroduit ='Personel') then 1 else 0 end) nbr_produit_perso,
    count(DISTINCT p.idproduit) nbr_total_produit 
    FROM magazinm
    INNER JOIN Produit p ON (p.numeromagazin = m.idmagazin)  
    GROUP BY
     m.villemagazin
    Le sum compte le nombre de produit personnel par ville alors que le count compte le nombre de produit par ville.

    2 le taux de présence par produits par ville

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT m.villemagazin, p.nomproduit, 
    sum(case when (p.typroduit ='Personel') then 1 else 0 end) nbr_produit_perso,
    count(DISTINCT p.idproduit) nbr_total_produit 
    FROM magazinm
    INNER JOIN Produit p ON (p.numeromagazin = m.idmagazin)  
    GROUP BY
     m.villemagazin, p.nomproduit
    Le sum compte le nombre de produit personnel par nom de produit dans la ville alors que le count compte tous les produits par nom de produit de la ville.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    Merci, je cours tester tout ça

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    Bonjour à tous

    je m'excuse pour le rétard que prend ma reponse, en faite je n'ai pas de connection le week end.
    Mr Barbibulle, en faite j'ai un problème avec la dernière requête :

    2 le taux de présence par produits par ville
    SELECT m.villemagazin, p.nomproduit,
    sum(case when (p.typroduit ='Personel') then 1 else 0 end) nbr_produit_perso,
    count(DISTINCT p.idproduit) nbr_total_produit
    FROM magazinm
    INNER JOIN Produit p ON (p.numeromagazin = m.idmagazin)
    GROUP BY m.villemagazin, p.nomproduit
    Le sum compte le nombre de produit personnel par nom de produit dans la ville alors que le count compte tous les produits par nom de produit de la ville.
    en effet ce que moi j'attend par le taux de présence par produits par ville c'est en fait le nombre de magazin qui vendent ce produit sur le nombre total de produit,
    voici un peu ce que je voulais dans le fichier joint que je vous apporte et Merci encore pour votre aide !
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    ou bien es que je peut dire que
    Le sum compte le nombre de produit personnel par nom de produit dans la ville
    represente le nombre de magazin ou le produit est vendu !
    j'avoue que je suis completement debousolé

  6. #6
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    En faite en fouillant les reponses postées, cette requête peut m'aider si j'arrive a introduire le nom des produits par ville dans cette requete je suppose !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT m.villemagazin, count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso, count(DISTINCT m.idmagazin) nbr_total_magasin_meme_ceux_sans_produits
    FROM magazinm
    LEFT JOIN Produit p ON (p.numeromagazin = m.idmagazin) AND (p.typroduit ='Personel')
    GROUP BY m.villemagazin
    .
    comment le faire ?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    en cherchant toujours je suis arrivé a ce stade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT m.quartiermagazin,p.nomproduit,
    sum(case when (p.typeproduit ='UNILEVER') then 1 else 0 end) nbr_produit_perso,
    count(DISTINCT m.idmagazin) nbr_total_magazin
    FROM magazin m
    INNER JOIN Produit p ON (p.numeromagazin = m.idmagazin) where p.typeproduit ='UNILEVER'
    GROUP BY
     m.quartiermagazin ,p.nomproduit
    ici donc j'ai bien dans le sum le nombre de magazin ou est vendu le produit x par exemple dans la ville, mais je n'ai pas dans le count le nombre total de magazin pour la ville
    j'ai besion d'aide

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Si vous n'arrivez pas à le faire avec un seul Select, faite le en 2.
    Et effectuez le calcul du taux dans votre application.

    Ou bien faites une procédure stockée.

    Pour votre probleme je dirais que le select doit plutôt ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select m.villemagazin, p.nomproduit, count(distinct p.fk_idmagazin) nbr_magasin_avec_produit_perso,
          s.nbmag as NB_mag_total
    from magazin m
    left join produits p on (p.fk_idmagazin = m.idmagazin) and (p.typeproduit ='Personel')
    inner join (select m2.villemagazin as ville, count(distinct m2.idmagazin) as nbmag from magazin m2 group by m2.villemagazin) S on s.ville=m.villemagazin
    group by m.villemagazin , p.nomproduit, s.nbmag
    Le count compte le nombre de magasin de la ville ayant le produit désigné par nomproduit de type personnel. Et s.nbmag contient le nombre total de magasin de la ville.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut

    MERCI beaucoup pour votre disponibilité voici ce que j'ai trouver a la fin pour le calcul du taux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT m.villemagazin, p.nomproduit,
    count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso,
    s.nbmag AS NB_mag_total,
    cast (cast (count(DISTINCT p.numeromagazin) as float) *100/ CAST (s.nbmag as float) as double precision) as taux
    FROM magazin m
    LEFT JOIN produit p ON (p.numeromagazin = m.idmagazin) AND (p.typeproduit ='PERSONEL')
    INNER JOIN (
    SELECT m2.villemagazin AS ville, count(DISTINCT m2.idmagazin) AS nbmag
    FROM magazin m2 GROUP BY m2.villemagazin) S ON s.ville=m.villemagazin
    GROUP BY m.villemagazin , p.nomproduit, s.nbmag
    1/ j'ai un gros soucis avec le cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast (cast (count(DISTINCT p.numeromagazin) as float) *100/ CAST (s.nbmag as float) as float) as taux
    il refuse de me donner le resultat sous forme de décimal
    j'ai aussi essayé ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast(count(DISTINCT p.numeromagazin) as float) *100/ CAST (s.nbmag as float)  as taux
    mais pareille

    2/ lors de l'execution de la requete il ya des lignes avec noms de produits null comment les interpreter ?

    Merci beaucoup

  10. #10
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Je suppose que c'est fixer le nombre de décimales que vous voulez :
    ici à 10 décimales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast (cast (count(DISTINCT p.numeromagazin) AS float) *100/ CAST (s.nbmag AS float) AS decimal(18,10)) AS taux
    Pour les produits dont le nom est null ce sont des produits dont vous avez un taux d'implantation a zero. Oubien vous avez des noms de produits à null.

    Essayez la requete suivante qui devrait vous afficher le nom des produits dont le taux est a zero. Si vous avez encore des noms produits a null c'est que vous avez des noms de produits à null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT m.villemagazin, p2.nomproduit,
    count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso,
    s.nbmag AS NB_mag_total, count(DISTINCT p2.numeromagazin) nbr_magasin_ayant_au_moins_un_de_ce_produit,
    cast (cast (count(DISTINCT p.numeromagazin) as float) *100/ CAST (s.nbmag as float) as double precision) as taux
    FROM magazin m
    LEFT JOIN produit p ON (p.numeromagazin = m.idmagazin) AND (p.typeproduit ='PERSONEL')
    inner join produit p2 ON (p2.numeromagazin = m.idmagazin)
    INNER JOIN (
    SELECT m2.villemagazin AS ville, count(DISTINCT m2.idmagazin) AS nbmag
    FROM magazin m2 GROUP BY m2.villemagazin) S ON s.ville=m.villemagazin
    GROUP BY m.villemagazin , p2.nomproduit, s.nbmag

  11. #11
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    la vraiment c'est la total
    merci pour tout

  12. #12
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    bonsoir a tous
    excuser d'avoir encore reouvert ce post qui était marqué comme resolu, car dans le joie d'avoir été aidé je n'avait pas bien remarqué certains détails. en

    1/ effet lors de l'exécution de cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT m.villemagazin, p2.nomproduit,
    count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso,
    s.nbmag AS NB_mag_total, count(DISTINCT p2.numeromagazin) nbr_magasin_ayant_au_moins_un_de_ce_produit,
    cast (cast (count(DISTINCT p.numeromagazin) AS float) *100/ CAST (s.nbmag AS float) AS double precision) AS taux
    FROM magazin m
    LEFT JOIN produit p ON (p.numeromagazin = m.idmagazin) AND (p.typeproduit ='PERSONEL')
    INNER JOIN produit p2 ON (p2.numeromagazin = m.idmagazin)
    INNER JOIN (
    SELECT m2.villemagazin AS ville, count(DISTINCT m2.idmagazin) AS nbmag
    FROM magazin m2 GROUP BY m2.villemagazin) S ON s.ville=m.villemagazin
    GROUP BY m.villemagazin , p2.nomproduit, s.nbmag
    je vois aussi apparaitre les produits qui ne sont pas de type personel or il ya bien cette restriction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LEFT JOIN produit p ON (p.numeromagazin = m.idmagazin) AND (p.typeproduit ='PERSONEL')
    qui devait pouvoir le faire

    2/
    j'avais voulu aussi ajouter une autre restriction pour ne prendre que les magazin de type 'GROSISTE', du coup je suis bloqué.

    Merci d'avance pour votre aide

  13. #13
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    1/ Oui ce sont les produits dont vous avez un taux d'implantation nul !

    2/ Rajouter avant le group by une chause Where m.typemag = 'GROSSISTE' et dans le sous select également where m2.typemag = 'GROSSISTE' si vous voulez compter que le total de magasin de type grossite

  14. #14
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    voici donc
    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
    SELECT m.quartiermagazin, p2.nomproduit,
    count(DISTINCT p.numeromagazin) nbr_magasin_avec_produit_perso,
    s.nbmag AS NB_mag_total, count(DISTINCT p2.numeromagazin) nbr_magasin_ayant_au_moins_un_de_ce_produit,
    cast (cast (count(DISTINCT p.numeromagazin) AS float) *100/ CAST (s.nbmag AS float) AS double precision) AS taux
    FROM magazin m
    LEFT JOIN produit p ON (p.numeromagazin = m.idmagazin) AND (p.typeproduit ='PERSONEL')
    INNER JOIN produit p2 ON (p2.numeromagazin = m.idmagazin)
    INNER JOIN (
    SELECT m2.quartiermagazin AS quartier, count(DISTINCT m2.idmagazin) AS nbmag
    FROM magazin m2
    WHERE m.typemagazin = 'GROSSISTE'
    GROUP BY m2.quartiermagazin) S ON s.quartier=m.quartiermagazin
    WHERE m2.typemagazin = 'GROSSISTE'
    GROUP BY m.quartiermagazin , p2.nomproduit, s.nbmag
    voici l'erreur qu'il me ramène
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dynamic SQL Error.
    SQL error code = -206.
    Column unknown.
    M.TYPEMAGAZIN.
    At line 11, column 9.
    Merci !

  15. #15
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Faites un effort...

    Il vous dit que la colonne M.Typemagazin n'existe pas.

    Recherchez dans la requête les "m.typemagazin" et posez vous la question pourquoi il ne connait pas...

    Ou relisez ma proposition 2/ je vous ai parlé de M2.typemag dans le sous select et non m.typemag...

  16. #16
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    OK je viens de comprendre , il va falloir que je me mette serieusement au travail en sql !

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

Discussions similaires

  1. problème de requete de calcul de taux
    Par devalender dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/06/2009, 19h15
  2. Problème de requete avec SUM
    Par fatiinfo dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/08/2008, 16h18
  3. [Hibernate]Problème de requete avec "join fetch"
    Par gauloiskiki dans le forum Hibernate
    Réponses: 4
    Dernier message: 21/06/2006, 09h54
  4. Problème de requete avec type monétaire
    Par Pymm dans le forum ASP
    Réponses: 11
    Dernier message: 09/09/2005, 16h57
  5. Problème de requete avec Innodb
    Par silef dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/04/2004, 12h54

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