Passé de lignes à collones, possible ? [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 22-12-2006 à 11:52:40
J'ai une question con : t'en fais quoi, après de ta requête?![[:autobot] [:autobot]](https://forum-images.hardware.fr/images/perso/autobot.gif)
Marsh Posté le 22-12-2006 à 13:08:31
| skeye a écrit : J'ai une question con : t'en fais quoi, après de ta requête? | 
 
 
Je la fou tel quel dans un fichier excel  
 
 
Apres je sais pas ce qu'ils en font, c'est plus mon problème 
Marsh Posté le 22-12-2006 à 13:22:04
salut, 
ca a déjà été traité ici http://forum.hardware.fr/hfr/Progr [...] 8586_1.htm 
et ici http://forum.hardware.fr/hfr/Progr [...] 8671_1.htm 
ca pourra peut-etre t'aider
Marsh Posté le 22-12-2006 à 16:38:19
SQL SERVER 2005 
 
J'ai regardé les exemples et sa ne m'a pas vraiment aidé 
 
En fait je crois que je vais devoir passé par une ecriture dynamique de la requête SQL 
 
Car je résume : 
 
 
1°) Table de communauté : 
 
id | lib 
1    Communauté1 
2    Communauté2 
3    Communauté3 
4    Communauté4 
 
2°) Table des utilisateurs 
 
id_user | id_communauté 
PAUL         1 
PAUL         3 
MARC        2 
BOB          1 
BOB          4 
 
3°) Ce que je voudrais 
 
id_user |  Communauté1  |  Communauté2  |  Communauté3  | Communauté4 
PAUL             OUI                   NON                   OUI                 NON 
MARC            NON                   OUI                   NON                 NON 
BOB              OUI                   NON                   NON                 OUI 
 
Donc en gros les collones de ce que je veut (3°) sont variables selon le contenu de la table de communauté (1°) 
Et le must serais tout de même que le libellé des collones du 3°) porte le nom du libellé de la communauté dans sa table 
 
 
Donc je pense que sa doit être construit dynamiquement, mais je ne sais pas encore comment   
 
Marsh Posté le 22-12-2006 à 16:48:30
la fonction pivot_table est ton amie, et c'est une nouveauté de SQL Server 2005
Marsh Posté le 22-12-2006 à 16:50:31
Oui je viens de voir ca sur google, j'essaye de me documenter un peu la  
 
 
J'éspère solutioner ce problème rapidement  
 
 
T'es un bon en SQL , chaque fois que j'ai eut un soucis, c'est toi qui a répondu !
Marsh Posté le 22-12-2006 à 17:18:47
En fait finalement je pense pas que sa fonctionne 
 
J'ai tenté le coup et d'une je ne sais pas utilisé PIVOT quand il ne s'agit pas de faire des sommes. 
Dans mon cas pas la peine de faire de SUM 
 
Secondo je ne sais pas combien de colonnes j'aurais, car elles dependent de la table Numero 1°) 
 
Je me trompe ? 
Marsh Posté le 22-12-2006 à 18:02:26
je ne connais pas du tout cette fonction. 
j'ai juste vu ça dans la doc un coup alors que je cherchais autrechose, donc je ne me suis pas attardé dessus. 
sous access en tout cas (mais aussi dans Excel) une table de pivot sert pourtant bel et bien à transformer des lignes en colonnes, en ajoutant une nouvelle dimension.
Marsh Posté le 26-12-2006 à 17:01:38
Bonjour, 
As-tu envisagé de mettre d'abord sous excel puis de "mouliner" sur la feuille? 
 
avec un sub de ce style: 
Sub tralala() 
'mettre toutes les colonnes à NON avant ou après 
Worksheets("feuil1" ).Select 
Set Wsht1 = Worksheets("feuil1" ) 
boubou = Wsht1.Cells(65536, 1).End(xlUp).Row 
Set Wsht2 = Worksheets(2) 
Range("a1" ).Select 
Wsht2.Range("a1" ) = Wsht1.Range("a1" ) 
For i = 1 To boubou 
    nom = Cells(i, 1) 
    coco = Cells(i, 2) 
    Set c = Wsht2.Range("A:A" ).Find(nom, LookIn:=xlValues) 
    If Not c Is Nothing Then 
        jinforme = c.Row 
    Else 
        fin2 = Wsht2.Cells(65536, 1).End(xlUp).Row + 1 
        Wsht2.Cells(fin2, 1).Value = nom 
        jinforme = fin2 
    End If 
    Wsht2.Cells(jinforme, 1 + coco) = "OUI" 
Next i 
End Sub 
 
 
Cordialement 
Sub tralala() 
'mettre toutes les colonnes à NON avant ou après 
Worksheets("feuil1" ).Select 
Set Wsht1 = Worksheets("feuil1" ) 
boubou = Wsht1.Cells(65536, 1).End(xlUp).Row 
Set Wsht2 = Worksheets(2) 
Range("a1" ).Select 
Wsht2.Range("a1" ) = Wsht1.Range("a1" ) 
For i = 1 To boubou 
    nom = Cells(i, 1) 
    coco = Cells(i, 2) 
    Set c = Wsht2.Range("A:A" ).Find(nom, LookIn:=xlValues) 
    If Not c Is Nothing Then 
        jinforme = c.Row 
    Else 
        fin2 = Wsht2.Cells(65536, 1).End(xlUp).Row + 1 
        Wsht2.Cells(fin2, 1).Value = nom 
        jinforme = fin2 
    End If 
    Wsht2.Cells(jinforme, 1 + coco) = "OUI" 
Next i 
End Sub 
 
 
Cordialement 
Marsh Posté le 27-12-2006 à 13:24:32
| seniorpapou a écrit : Bonjour,  | 
 
+1 je pense que c'est la meilleure solution
Marsh Posté le 27-12-2006 à 13:32:01
je n'ai quasi jamais touché a du sql server mais je suppose qu'il doit +/- offrir les memes possibilités que oracle au niveau sql dynamique, alors ce que je ferai dans un ps: 
 
1) tu récuperes dans un curseur tous tes id distincts 
2) tu fetchs le curseur en crééant dynamiquement le sql de ton create table style 
 
| Code : 
 | 
 
 
et tu executes ton sql, de nouveau en sql serveur faut pas me demander, mais l'equivalent oracle est execute immediate 
 
3) tu inseres dans ta table les noms distincts des gars 
 
4) tu updates chaque ligne en allant chercher dans une sous-requetes les valeurs, c'est pas du tout optimal comme méthode mais je suppose qu'on ne parle pas de millions de records, et il faut repasser par un loop des valeurs distinctes de communaute pour faire ca en sql dynamique. 
 
style: 
 
| Code : 
 | 
 
 
     
ca devrait le faire 
 
good luck 
Marsh Posté le 27-12-2006 à 14:28:45
J'ai utilisé une methode a peu pres equivalente a celle que tu viens de me conseiller et j'ai reussit a obtenir ce que je voulais 
 
1°) Je recupere les id distinct de mes communautés et je creer une table avec 
 
2°) J'utilise un curseur pour créer ma requete de pivot 
 
3°) Je remplace les enregistrement en .Net, en disant si >0 alors Oui sinon Non 
 
Et sa fonctionne 
 
C'etais bien prise de tête 
 
Merci a vous tous 
Marsh Posté le 03-01-2007 à 12:00:37
Salut , pourrais tu poster ton code s'il te plait car je suis dans le meme cas que toi , et je débute dans le sql. 
 
Merci d'avance.
Marsh Posté le 03-01-2007 à 13:47:37
Je te post ca demain si je suis au bureau, parceque le jour de l'an a laissé quelque sequel sur ma personne 
Marsh Posté le 04-01-2007 à 08:42:21
Ok j'attend ca avec impatience  !
 !
Marsh Posté le 10-01-2007 à 00:12:31
bonjour,  
une petite solution qui peut peut etre fonctionner condition de connaitre le nombre de valeurs distinctes de communautés, ce qui est ton cas. Mais c'est un peu chiant à taper.. 
 
pour chaque colonne de communauté dans la  table de résultat, il faut faire une requete du style 
case when utilisateurs.id_communaute=X then 1 
else 0 
end 
 
ce qui donne par exemple pour 3 communautés distinctes :  
select U.ID, case when U.id_communaute=1 then 1 
else 0 
end 
communaute1, 
case when U.id_communaute=2 then 1 
else 0 
end 
communaute2, 
case when U.id_communaute=3 then 1 
else 0 
end 
communaute3 
 
puis il ne reste plus qu'a agréger ces lignes. 
select ID, sum(communaute1),sum(ccommunaute2),sum(ccommunaute3) from ( 
select U.ID ID, case when U.id_communaute=1 then 1 
else 0 
end 
communaute1, 
case when U.id_communaute=2 then 1 
else 0 
end 
communaute2, 
case when U.id_communaute=3 then 1 
else 0 
end 
communaute3 
from utilisateurs U) 
group by ID 
 
en combinant cela avec un insert into, tu peux alimenter ta table, avec l'avantage de travailler en ensembliste. 
Marsh Posté le 10-01-2007 à 09:33:20
Inspire toi de cette procédure stockée :  
 
http://www.sqlteam.com/item.asp?ItemID=2955 
 
Marsh Posté le 10-01-2007 à 10:03:29
Voila celle que j'ai utilisé et qui fonctionne chez moi (inspiré d'un exemple sur le net) 
 
| Code : 
 | 
 
Marsh Posté le 20-06-2007 à 15:33:23
Salut, j'ai le même problème, je voudrais utiliser la fonction PIVOT pour transformer les colonnes en lignes, mais dans les exemples que j'ai trouvé il y a toujours utilisation de la somme SUM mais que dans mon cas c un pivot simple ! 
 
Merci d'avance. 
Marsh Posté le 22-12-2006 à 11:50:55
Bonjour la compagnie 
 
 )
) 

Deja bonne fêtes de fin d'année a tous ! (si possible ailleurs qu'au boulot
J'ai une chtite question a propos d'une requête que je n'arrive pas a matérialiser, voici le principe :
J'ai un user qui appartient a plusieurs communautés donc dans la table sa donne :
user 1 | communauté1
user 1 | communauté2
user 1 | communauté3
user 2 | communauté1
user 2 | communauté7
Et j'aimerais obtenir ceci avec une requete en :
Iduser | communauté1 | communauté2 | communauté3 | communauté4 | communauté5 | communauté6 | communauté7 |
______________________________________________________________________________________________________
user 1 | OUI | OUI | OUI | NON | NON | NON | NON |
user 2 | OUI | NON | NON | NON | NON | NON | OUI |
Sachant qu'il existe au maximum 40 communautés, donc au lieu de 7 il yaura 40 collones
Une idée sur la requete ?
Merci d'avance
Message édité par hassbak le 22-12-2006 à 11:51:40
---------------
Je vous préviens, je suis une merde en orthographe, vous me parlé à vos risques et périls !