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 :

nombre de répétitions dans chaînes de caractères


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 12
    Points : 11
    Points
    11
    Par défaut nombre de répétitions dans chaînes de caractères
    Bonjour,

    un petit problème un peu complexe:

    j'ai une table de ce type là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    | id_personne |   loisirs    |
    ------------------------------
    |     long    | varchar(200) |
    J'aimerai lister les loisirs les plus populaires. Je sais le schéma de la table n'est pas idéal pour faire ceci...
    Comment faire pour énumérer tous les loisirs possible et ensuite compter le nombre de fois où ils apparaissent ?

    je ne sais pas trop par quel cotté commencer...

    merci d'avance pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut
    Voila la requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct loisirs,COUNT(*)
    from ta_table
    group by loisirs
    Au niveau conception de ta table, je pense kon peut faire mieux.
    Tes loisirs doivent etre identiques (au niveau textuel) pour que ca marche.
    Voilà bon courage




  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    c'est pas tout à fait ça... ta solution va compter les personnes qui ont les mêmes loisirs et listésdans le même ordre.
    en fait pour chaque personne, j'ai une liste de loisirs:
    "foot, ski, lecture"
    et mon souci est plus dans l'énumération de cette liste.

    En fait j'ai bien peur qu'il faille créer une table plus adaptée à ce genre de requête...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Que penses-tu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT loisirs, count(*)
    FROM Table
    GROUP BY loisirs
    ORDER BY 2 DESC
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut Re: nombre de répétitions dans chaînes de caractères
    Citation Envoyé par jocarina
    j'ai une table de ce type là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    | id_personne |   loisirs    |
    ------------------------------
    |     long    | varchar(200) |

    Peut-être pas grand chose à voir avec ton problème, mais un champ de type Long est inexploitable en SQL, alors s'en servir comme identifiant d'une table me paraît EXTREMEMENT dangereux !
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    pour magnus: c'est pareil que la requete d'avant: ca va considérer le champ loisirs en entier et pas énumérer la liste.
    J'aimerai bien pouvoir isoler chaque élément (ils sont tous séparés par des virgules)

    pour Xo: j'ai mis 'long' par defaut (je me rappelle pas exactement des types du schema)

    sinon, j'ai eu une idée:
    créer une table supplémentaire avec un seul champ 'loisir' dans lequel il n'y aura qu'un loisir à la fois

    par exemple les lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (1, "foot, ski, lecture")
    (2, "tennis, ski, foot")
    deviendra les lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foot
    ski
    lecture
    tennis
    ski
    foot
    et la dessus on peut faire un count... group by qui coresppond à ce que je veux obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foot    2
    lecture 1
    ski     2
    tennis  2
    Donc mainteant mon problème, c'est comment passer d'une table à l'autre... ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut
    oh la la c très très dangereux ce ke tu fais !!!
    Une liste dans une colonne , c pas bon dans tous les sens du terme :
    insertion, suppression, recherche ... etc

    Pquoi tu créés pas une table loisir avec un id_loisir et libelle_loisir
    Puis tu modifies ta table précédente
    id_personne et id_loisir

    et ensuite tu fais ta requete avec une petite jointure et le tour est joué.


  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 781
    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 781
    Points : 52 770
    Points
    52 770
    Billets dans le blog
    5
    Par défaut
    Votre base est horribelement mal modélisée. Autant revenir au cobol ou à excel. Aucune requête efficace ne pourra vous sortir de ce mauvais pas.

    Commencer par modéliser de façon "normale" (c'est à dire en respectant les formes normales) vos tables.

    Si vous maintenez une telle absurdité, la seule solution consiste à créer une table des loisirs par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE T_LOISIR_LSR
    (LSR_ID INTEGER NOT NULL PRIMARY KEY,
     LSR_LIBELLE VARCHAR(32))
    remplissez là correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO T_LOISIR_LSR VALUES (1, 'ping-pong')
    INSERT INTO T_LOISIR_LSR VALUES (2, 'ski')
    INSERT INTO T_LOISIR_LSR VALUES (3, 'belote')
    ...
    Avec votre table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE T_MaTable
    (idPersonne integer, loisirs VARCHAR(200))
    INSERT INTO T_MaTable VALUES (1, 'foot, ski, lecture')
    INSERT INTO T_MaTable VALUES (2, 'tennis, ski, foot')
    Dès lors la requête pourra s'exprimer :

    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
    16
    17
    SELECT LSR_LIBELLE, COUNT(*) AS NOMBRE
    FROM
    (
    SELECT *
    FROM   T_MaTable MTB
           INNER JOIN T_LOISIR_LSR LSR
                 ON MTB.loisirs LIKE '%' || LSR.LSR_LIBELLE || '%'
    ) T
    GROUP BY LSR_LIBELLE
    ORDER BY 2 DESC
     
    LSR_LIBELLE                      NOMBRE      
    -------------------------------- ----------- 
    foot                             2
    ski                              2
    tennis                           1
    lecture                          1

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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Wow !
    Merci bien !

    effectivement ca peut être la solution pour obtenir le résultat que je veux.


    Question subsidiaire:

    Je vais effectivement changer le modèle de table (ce n'est pas exploitable dans l'état actuel)

    Table des loisirs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE T_LOISIR_LSR
    (LSR_ID INTEGER NOT NULL PRIMARY KEY,
     LSR_LIBELLE VARCHAR(32))
    Table des loisirs des personnes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE T_Loisirs_Pratiques
    (USR_ID INTEGER NOT NULL,
     FK_LSR_ID INTEGER NOT NULL REFERENCES T_LOISIR_LSR(LSR_ID));
     
    ALTER TABLE T_Loisirs_Pratiques 
    ADD PRIMARY KEY(USR_ID, FK_LSR_ID);
    je ne suis pas sûre de la syntaxe exacte, mais c'est quelque chose de ce style qu'il faut faire n'est-ce pas ?

  10. #10
    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
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu n'as pas dans un coin une tables des Utilisateurs ?
    Dans ce cas, la colonne USR_ID dans T_Loisirs_Pratiques est aussi une FK.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    exact, merci beaucoup

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

Discussions similaires

  1. Isoler caractères dans chaîne de caractères
    Par neige2027 dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/08/2009, 09h19
  2. calculer le nombre de répétition dans un vecteur
    Par brf1982 dans le forum MATLAB
    Réponses: 4
    Dernier message: 20/08/2009, 19h27
  3. Réponses: 14
    Dernier message: 14/02/2009, 07h56
  4. Réponses: 2
    Dernier message: 09/07/2008, 15h20
  5. Nombre de répétitions dans une requête
    Par Superjuju92 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/04/2008, 00h17

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