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 :

Division en SQL !!


Sujet :

Langage SQL

  1. #1
    BGS
    BGS est déconnecté
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Par défaut Division en SQL !!
    En SQL il n'existe pas d'equivalent direct à la division qu'on
    trouve en Algèbre relationnelle.
    Comment peut on alors effectuer une division en SQL ?
    :pingoin:

  2. #2
    Membre chevronné Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Par défaut
    Si je ne m'abuse, c'est DIV qui fait office de division... MOD te donne le reste, et / fonctionne aussi, je crois.

    Hélas, je n'ai pas les moyens de tester ici, mais essaie ces quelques exemples (pour oracle, mais tu peux les adapter à ton SGBDR):
    Devrais te retourner 2 (4 divisé par 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DIV(4,2) FROM DUAL;
    Devrais te retourner 2 (4 divisé par 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MOD(4,2) FROM DUAL;
    Devrait te retourner 0 (le reste de la division de 4 par 2)

  3. #3
    BGS
    BGS est déconnecté
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Par défaut
    Je crois que ma question était mal posée !!!
    En fait, je parle de la division d'une table sur une autre table
    ex: Table_C = Table_A / Table_B
    et non pas de la division de deux nombres.
    A titre d'exemple, si on dévise la table A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NCmd	NP	
    C001	P001    
    C002	P007	
    C003	P001	
    C004	P001	
    C004	P002	
    C004	P003	
    C004	P004	
    C004	P005	
    C004	P006	
    C004	P007	
    C004	P008
    par la Table B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NP
    P001
    P002
    P003
    P004
    P005
    P006
    P007
    P008
    ça va nous donner la table C :
    Et ceci car C004 (commande 4) contient tout les élements de la
    table B(table des produits).
    La division dans l'algèbre relationnelle est indispensable dans des requêtes tel que:
    "Trouvez les commandes contenant tout les produits "
    (comme ds l'exemple que j'ai donné)
    ou encore "Trouvez les clients qui ont vu tout les filmes."
    Et c'est cela que je n'ai pas pu effectuer, car je n'est pas trouvé d'equivalent en SQL !


  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Par défaut
    Je sais pas si division est vraiment le terme adéquat...

    Par contre une jointure avec un GROUP BY et un HAVING COUNT me parrait plus correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ncmd FROM A 
    GROUP BY ncmd Having Count(np) IN (SELECT count(np) FROM  B);
    Je ne sais pas si ma requete marche mais tu as l'idée générale.

  5. #5
    BGS
    BGS est déconnecté
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Par défaut

    ça marche !!!
    MERCI beaucoup Gaël Donat.
    Pour le nom, en algèbre relatinnelle on l'appelle Division ça j'en suis sûr,pour le SQL je ne sais pas.
    Merci encore

  6. #6
    Membre éclairé Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Par défaut
    Bonjour, j'aurais 2 critiques à faire (critique dans le sens positif du terme bien sûr :-) )

    SELECT ncmd FROM A
    GROUP BY ncmd Having Count(np) IN (SELECT count(np) FROM B);
    1. le count ici ne retourne qu'un élément donc tu peux mettre un =, mais c'est vraiment un détail :-)

    2. En fait, ce n'est pas vraiment l'équivalent d'une division puisque tu comptes les éléments. Si tu as des doublons dans ta table, ca risque de ne pas marcher (en même temps, suffirait de mettre un supérieur à la place du IN )

    Donc, je suis aussi à la recherche d'une autre solution, même si la solution donnée me satisfait dans mon cas, mais c'est par curiosité

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    count( DISTINCT lacolonne) fonctionne il me semble

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ncmd FROM A 
    GROUP BY ncmd HAVING COUNT(DISTINCT np) = (SELECT COUNT(DISTINCT np) FROM B)
    Le deuxième distinct est souvent inutile, la table B étant généralement une table de référence.

    [EDIT]
    Orafrance tu m'as grillé de moins d'une minute
    [/EDIT]

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    trop tard

  10. #10
    Membre éclairé Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Par défaut
    Et moi aussi vous m'avez grillé avant mon edit avec un supérieur à la place du IN

  11. #11
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Je ne vois pas en quoi le "supérieur" fonctionne ?

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 995
    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 995
    Billets dans le blog
    6
    Par défaut
    Vos solution ne sont qu'une partie infime de la solution générale de la division relationnelle et ne marche qua dans des cas bien particuliers.

    Voici la solution générale : http://sqlpro.developpez.com/cours/divrelationnelle/

    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. ACCESS SQL : division entière ?
    Par kikidrome dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/10/2014, 09h12
  2. division en sql
    Par looping dans le forum SQL
    Réponses: 2
    Dernier message: 10/10/2013, 11h50
  3. Division en sql
    Par alexorcet dans le forum SQL
    Réponses: 6
    Dernier message: 11/06/2008, 08h34
  4. Division et SQL
    Par ra_inah dans le forum Oracle
    Réponses: 9
    Dernier message: 10/08/2006, 16h20
  5. [SQL Server] probléme de division
    Par MichMich29 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/06/2006, 15h38

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