6
votes

Affichage des colonnes en tant que lignes dans SQL Server 2005

J'ai lu des dizaines de solutions à des problèmes de transposition similaires comme celui que je suis sur le point de proposer mais curieusement aucun qui reflète exactement mon problème. J'essaie simplement de retourner mes lignes dans des colonnes dans un simple jeu de données de type tableau de bord.

Les données lorsqu'elles sont tirées de différentes tables de transaction ressemblent à ceci: p> xxx pré>

et je Voulez-vous pouvoir générer ce qui suit: p>

                      Jan 2012   Feb 2012   Mar 2012

Transactions          100        200        300
Customers             50         100        200
Visits                150        300        600


1 commentaires

Vérifiez la version pivot dynamique dans la réponse de Bluefeet sur Stackoverflow.com/Questtions/13372276/...


3 Réponses :


2
votes

3 commentaires

Cross Appliquer ... Valeurs Ne fonctionne pas en 2005. Vous pouvez utiliser Cross Appliquer (sélectionnez T.Transactions, NULL, NULL, '' transaction '' 'Union Tout SELECT NULL, T. Clients, NULL, '"Union" des clients ...)


Merci Martin pour une clarification!;) Réponse mise à jour. BTW, si utilisez Cross Appliquer (sélectionnez Transactions, clients, visites, pvtcolumns de (valeurs (T.Transactions, NULL, NULL, '' transaction ''), (NULL, T.CUSTOMERS, NULL, '' CUSTOMERS ''), (NULL, NULL, T.VISITS, '' VISITES '')) X (Transactions, clients, visites, PVTColumns)) O ... cela fonctionnera?


Merci beaucoup pour les réponses géniales! La seule question que je reste qui reste est un moyen facile de commander les métriques comment je les veux? Dans les trois réponses, les métriques ont été réorganisées dans l'ordre alpha. Merci encore!



1
votes

Si vous pouvez savoir combien de périodes de date à l'avance différentes, vous pouvez utiliser une requête fixe comme suit: xxx pré>

SQL Fiddle Demo strong>


Si combien de temps de date est imprévisible, @Alexander a déjà donné la solution, le code suivant n'est qu'un deuxième avis, au lieu d'utiliser Appliquer forte>, en utilisant Union STROND> P >

DECLARE @cols nvarchar( max),
        @query nvarchar (max),
        @selective nvarchar(max)
SELECT @cols =
  STUFF((SELECT ',' + QUOTENAME(t.DatePeriod) AS ColName                               
         FROM table1 t                   
         FOR XML PATH( ''), TYPE).value ('.', 'nvarchar(max)'),1,1,'')

SELECT @selective =
  STUFF((SELECT ',MAX(' + QUOTENAME(t.DatePeriod) +') as ' + QUOTENAME(t.DatePeriod)  AS ColName                               
         FROM table1 t                   
         FOR XML PATH( ''), TYPE).value ('.', 'nvarchar(max)'),1,1,'')

set @query = '
;with CTE_UNIONTable
as 
(
select [DatePeriod],[PeriodNumberOverall],[Transactions] as [value], ''Transactions'' as subType from table1
UNION ALL 
select [DatePeriod],[PeriodNumberOverall],[Customers] as [value], ''Customers'' as subType from table1
UNION ALL 
select [DatePeriod],[PeriodNumberOverall],[Visits] as [value], ''Visits'' as subType from table1
), CTE_MiddleResult
as 
(
select * from CTE_UNIONTable
    pivot 
    (
       max(value) 
       for DatePeriod in ('+@cols+')
     ) as P
)
select SubType,' + @selective + ' 
from CTE_MiddleResult
group by SubType'

exec(@query)


2 commentaires

Merci beaucoup pour les réponses géniales! La seule question que je reste qui reste est un moyen facile de commander les métriques comment je les veux? Dans les trois réponses, les métriques ont été réorganisées dans l'ordre alpha. Merci encore!


Vous pouvez ajouter de la commande à la fin, mais ASC ou DESC, quel ordre exact souhaitez-vous, peut-être que le code doit mettre à jour un peu la base de la commande de votre choix.



2
votes

Pour obtenir le résultat que vous souhaitez avoir besoin de tout d'abord impublard code> les données, puis pivotez les valeurs code> datéperiod`.

L'impulsion va transformer le multiple Colonnes de Transactions code>, clients code> et visites code> dans plusieurs rangées. Les autres réponses utilisent un Union tout code> à impulsions mais SQL Server 2005 a été la première année où la fonction impublard code> était prise en charge. P>

La requête pour impuche la Les données sont les suivantes: p> xxx pré>

voir Démo . Cela transforme vos colonnes actuelles en plusieurs lignes. Les données ressemblent aux données suivantes: p> xxx pré>

maintenant, car les données sont en lignes, vous pouvez appliquer le pivot Fonction à la colonne CODE> DATEPERIOD CODE>: P>

|          COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions |      100 |      200 |      300 |
|    Customers |       50 |      100 |      200 |
|       Visits |      150 |      300 |      600 |


4 commentaires

Merci beaucoup pour les réponses géniales! La seule question que je reste qui reste est un moyen facile de commander les métriques comment je les veux? Dans les trois réponses, les métriques ont été réorganisées dans l'ordre alpha. Merci encore!


@ user2234794 Voir mon édition, j'ai mis à jour ma réponse pour inclure une commande Mes positions initiales de colonnes


Merci pour la mise à jour. La principale "table" que j'utiliserai pour transposer pour mon tableau de bord ne fera pas partie du schéma - ce seront des éléments de données (métriques / champs agrégés) tirés de plusieurs autres tables) dans une table TEMP. Y a-t-il une autre façon de commander si je ne tire pas mes champs d'une seule table existant dans mon schéma? Toutes mes excuses si la question est simple / basique - je ne suis pas un expert en T-SQL par aucune mesure.


@ user2234794 Oui, vous pouvez vous joindre à une table dérivée contenant un tri. Voir mon édition