2010-08-12 4 views
2

Salut, je voudrais tourner une table complète:transposition d'une table

LANGUAGE litAccept litDelete litErrorMsg .............. 
------------------------------------------------- 
SPANISH Accept Delete Error has ocurred 
ENGLISH Aceptar Borrar Ha ocurrido un error 
..... 

en quelque chose comme ceci:

LANGUAGE  ENGLISH SPANISH 
--------------------------------------- 
litAccept Accept Aceptar  
litDelete Aceptar Borrar  
litErrorMsg Error.. Ha ocurridO.. 
... 

Je vois avec PIVOT vous pouvez faire pivoter une table, mais je ne savoir qui fait ça!

S'il vous plaît aider, merci

+0

avez-vous regardé serveur SQL en ligne? –

+0

Pivot ne le fait pas directement. Peut-être que vous pourriez utiliser 'unpivot' d'abord, puis essayez d'utiliser' pivot' pour le ramener dans n'importe quel format. Je suis un peu confus au sujet des données que vous avez "Accepter" et "Supprimer" dans la ligne "ESPAGNOL" pour commencer (ce qui semble faux pour commencer). Ensuite, dans la version transformée «Supprimer» a totalement disparu. –

+0

Oui, c'est une erreur! Remplacer 'Aceptar' dans la deuxième ligne par 'Supprimer' – Diego

Répondre

1

Wow je l'ai fait !!

Maintenant, je comprends comment cela fonctionne PIVOT. J'ai essayé de faire pivoter toute la table à la fois avec SQL dynamique et il n'y a aucun moyen de l'intégrer dans la syntaxe de pivot. La rotation doit être faite colonne par colonne (PIVOT) ou ligne par ligne (UNPIVOT) en les insérant dans une table temporelle pour obtenir la transposition complète à la fin.

Je pense que c'est le chemin pour moi .. mais peut-être qu'il peut être fait dans une seule requête ?? (UNION ALL n'est pas valide, vous le savez; P)

Le jour prochain j'écrirai la solution que j'ai trouvée.

Merci!

+0

Vous devriez être en mesure d'utiliser pivot et unpivot dans une seule requête plutôt que de créer une table temporaire avec la sortie de l'unpivot devenant l'entrée du pivot. –

+0

Comment pouvez-vous le faire si le nombre de lignes et de colonnes est dynamique? – Diego

0

Ceci peut être complété en utilisant SQL dynamique avec un UNPIVOT puis un PIVOT.

DECLARE @colsUnPivot AS NVARCHAR(MAX), 
    @colsPivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @colsUnPivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('t') and 
       C.name like 'lit%' 
     for xml path('')), 1, 1, '') 

SET @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(c.Language) 
      FROM t c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 
      'SELECT * from 
      (
       select Language l1, type language, value 
       from t 
       unpivot 
       (
        value 
        for type in (' + @colsUnPivot + ') 
       ) upvt 
      ) x 
      pivot 
      (
       min(value) 
       for l1 in (' + @colsPivot + ') 
      ) p ' 


execute(@query) 

Voir SQL Fiddle with a Demo