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 :

Récupération de couple de valeur d'un même champ


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Consultant BI
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant BI

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Par défaut Récupération de couple de valeur d'un même champ
    Bonjour,

    Je cherche a connaitre les couples d'application les plus utilisées parmis mes utilisateurs
    Je dispose par exemple d'une liste avec
    USER;APPLI
    Marc;App1
    Marc;App2
    Lucas;App1
    Lucas;App3
    .....

    Et je cherche a connaitre les couples d'application les plus utilisées, mais je ne vois pas du tout commencer concaténéer des valeur distinctes d'un même champ.

    pour info, j'utilise Sybase IQ.

    Merci de votre aide !

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 37
    Par défaut
    Bonjour,

    il y a un problème de modélisation dans votre base si un champ contient 2 informations distinctes.

    Pour résoudre votre problème sans refondre votre base, il va vous falloir découper votre champs avec des fonctions gérant les chaines de caractères (par exemple substring et charindex peuvent vous être utile).

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Consultant BI
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant BI

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Par défaut
    En réalité, pour ma liste, il ne s'agit pas d'une table mais du resultat d'une requete. Dans ma table de fait, je prend la liste des utilisateurs, et les applis qu'ils utilisent. Si un utilisateur utilise deux applications, alors ma requete retournera deux lignes.
    L'idéal serait pour moi d'avoir quelquechose comme:
    Marc;App1|App2
    Lucas;App1|App3
    Antoine;App1

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par valorz Voir le message
    En réalité, pour ma liste, il ne s'agit pas d'une table mais du resultat d'une requete. Dans ma table de fait, je prend la liste des utilisateurs, et les applis qu'ils utilisent. Si un utilisateur utilise deux applications, alors ma requete retournera deux lignes.
    L'idéal serait pour moi d'avoir quelquechose comme:
    Marc;App1|App2
    Lucas;App1|App3
    Antoine;App1
    Ce que vous cherchez, c'est la fonction d'aggrégation "GROUP_CONCAT" qui existe par défaut dans MySQL.

    Dans SQL Server, vous pouvez utiliser la fonction CLR que j'ai écrit.
    http://www.developpez.net/forums/d14...utilisant-clr/

    Sur les autres SGBD, voyez comment étendre les capacités natives, ou lancez-vous dans un PL/SQL complexe et peu performant.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par valorz Voir le message
    Et je cherche a connaitre les couples d'application les plus utilisées, mais je ne vois pas du tout commencer concaténéer des valeur distinctes d'un même champ.
    Bonjour,
    Il faudrait surtout définir comment vous définissez les "couples d'application les plus utilisées". Vous parlez réellement de couple (2-uplet) ou bien il peut y avoir plus de 2 applications (et donc, des N-uplets) ? Et s'il s'agit bien de couple, vous voulez associer à un couple (app1, app2) le nombre d'utilisateurs distincts qui ont utilisé chacune des deux application ?

    Si oui, alors une requête du genre (fait sous SQL Server) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    WITH liste AS 
    (
    SELECT 'user_1' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_1' AS user_code , 'app_B' as app
    UNION ALL
    SELECT 'user_1' AS user_code , 'app_C' as app
    UNION ALL
    SELECT 'user_2' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_2' AS user_code , 'app_B' as app
    UNION ALL
    SELECT 'user_3' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_3' AS user_code , 'app_C' as app
    UNION ALL
    SELECT 'user_4' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_4' AS user_code , 'app_B' as app
    UNION ALL
    SELECT 'user_5' AS user_code , 'app_B' as app
    ),
    -- Gagnerait à être extrait d'une table directement plutôt que de la sous-requete
    applications AS
    (
    SELECT DISTINCT app
      FROM liste
    ),
    couples AS
    (
    SELECT a1.app AS app1, a2.app AS app2
      FROM applications a1 CROSS JOIN applications a2 
     WHERE a1.app < a2.app
    )
    SELECT app1, app2, COUNT(DISTINCT l1.user_code) AS Nb
      FROM couples c
    	   INNER JOIN liste l1 ON l1.app = c.app1 
    	   INNER JOIN liste l2 ON l2.app = c.app2
    						  AND l2.user_code = l1.user_code
    GROUP BY app1, app2
    ORDER BY 3 DESC

    EDIT : si le but est d'avoir pour chaque utilisateur la liste concaténée des applications, ce que je ne conseille pas de faire sous SQL, alors :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    WITH liste AS 
    (
    SELECT 'user_1' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_1' AS user_code , 'app_B' as app
    UNION ALL
    SELECT 'user_1' AS user_code , 'app_C' as app
    UNION ALL
    SELECT 'user_2' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_2' AS user_code , 'app_B' as app
    UNION ALL
    SELECT 'user_3' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_3' AS user_code , 'app_C' as app
    UNION ALL
    SELECT 'user_4' AS user_code , 'app_A' as app
    UNION ALL
    SELECT 'user_4' AS user_code , 'app_B' as app
    UNION ALL
    SELECT 'user_5' AS user_code , 'app_B' as app
    ),
    ranked AS
    (
    SELECT user_code
    	 , CAST(app AS NVARCHAR(MAX)) AS app
    	 , ROW_NUMBER() over (PARTITION BY user_code ORDER BY app) AS rang
    	 , COUNT(*) over (PARTITION BY user_code) AS Nb
      FROM liste
    ),
    concatenation AS
    (
    SELECT user_code, app, rang, nb
      FROM ranked
     WHERE rang = 1
    UNION ALL
    SELECT c.user_code, c.app + ' | ' + r.app, r.rang, c.nb
      FROM concatenation c
    	   INNER JOIN ranked r ON r.user_code = c.user_code
    						  AND r.rang = c.rang + 1
    )
    SELECT *
      FROM concatenation
     WHERE rang = nb

Discussions similaires

  1. Plusieurs valeurs dans un même champ
    Par fidecourt dans le forum Outils
    Réponses: 2
    Dernier message: 30/01/2013, 01h03
  2. Réponses: 6
    Dernier message: 08/04/2008, 14h17
  3. Réponses: 7
    Dernier message: 02/10/2006, 21h46
  4. Plusieurs valeurs pour un même champ
    Par will89 dans le forum Requêtes
    Réponses: 32
    Dernier message: 14/06/2006, 11h06
  5. Récupération de couple de valeur
    Par Premium dans le forum C
    Réponses: 24
    Dernier message: 31/05/2006, 19h33

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