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

Développement SQL Server Discussion :

Tableau pour croiser des données dans une table [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut Tableau pour croiser des données dans une table
    Bonjour,

    J'ai une demande que je ne sais pas comment aborder en SQL.

    Je peux l'exécuter en SQL 2008 ou en SQL 2012 si besoin.

    J'ai une table, nommons là Table1, qui contient une liste d'usager et un numéro de document.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Custodian	NoDocument
    Jacinthe  	14108     
    Philippe  	14108     
    Philippe  	14109     
    Philippe  	14110     
    Yohan     	14108     
    Yohan     	14110
    J'ai besoin de produire un tableau indiquant le nombre de document en commun pour chacune des personnes. Un résultat comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Jacinthe   Philippe   Yohan
    Jacinthe   1           1         1
    Philippe   1           3         2
    Yohan      1           2         2
    Ce tableau signifie que Jacinthe et Philippe ont 1 document en commun (le numéro 14108). Philippe et Yohan ont 2 documents en commun (les numéros 14108 et 14110). L'intersection pour une même personne indique seulement le nombre de document qu'il possède.

    Je serais capable de produire un résultat avec deux curseurs imbriquées. Mais surement qu'une solution plus propre doit exister avec la récursivité, mais je maitrise moins bien ces concepts.

    Avez vous une idée de piste de solution à me fournir pour m'aider à produire un résultat?

    Merci !
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  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,

    Il ne parait pas adéquat de présenter les données sous cette forme. En effet, le nombre de colonnes de la requete dépendra du nombre de "Custodian" différents...

    Il serait préférable de présenter le résultat en ligne (et de pivoter le cas échéant dans votre programme, au moment de l'affichage)

    Vous pouvez alors faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT	T1.Custodian, T2.Custodian, COUNT(*) AS NbDocuCommun
    FROM	LaTable T1
    INNER JOIN LaTable T2 
    	ON T2.NoDocument = T1.NoDocument
    GROUP BY T1.Custodian, T2.Custodian
    ORDER BY 1,2
    -->
    Custodian Custodian NbDocuCommun
    --------- --------- ------------
    Jacinthe  Jacinthe  1
    Jacinthe  Philippe  1
    Jacinthe  Yohan     1
    Philippe  Jacinthe  1
    Philippe  Philippe  3
    Philippe  Yohan     2
    Yohan     Jacinthe  1
    Yohan     Philippe  2
    Yohan     Yohan     2
    

    Par ailleurs, en ce qui concerne la modélisation, il serait préférable d'avoir une table des personnes et d'y faire référence au lieu d'utiliser les prénoms comme vous le faites...

  3. #3
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Merci beaucoup pour votre aide. La requête me retourne exactement ce dont j'avais besoin. Je ne sais pas pourquoi je tenais à trouver une solution qui me donnerait tout de suite le résultant en tableau ?

    Pour ce qui est de la modélisation des données, vous avez tout à fait raison. Toutefois ne vous inquiétez pas, ma demande a été formulée de manière à ce que ce soit simple à expliquer, mais cela provient d'un système beaucoup plus complexe en arrière. Il ne me manquait que ce petit bout que je n'arrivais pas à trouver une solution. Votre requête sera intégré à mon système.

    Merci encore !
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

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

Discussions similaires

  1. [AC-2010] Erreur pour supprimer des données dans une table liée
    Par marieo dans le forum Access
    Réponses: 2
    Dernier message: 19/03/2016, 11h00
  2. Réponses: 3
    Dernier message: 28/03/2015, 10h15
  3. Réponses: 7
    Dernier message: 24/01/2012, 19h55
  4. [MySQL] Php, je ne comprends pas comment faire pour introduire des données dans une table
    Par Liondd dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 14/12/2006, 13h53
  5. Réponses: 2
    Dernier message: 15/06/2005, 18h32

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