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> 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
3 Réponses :
Vous devez créer de manière dynamique une instruction SQL avec Pivot et Appliquer A > Opérateurs à la volée puis exécutez cette commande. Si vos métriques statiques (transactions, clients et visites), nous pouvons donc utiliser l'opérateur cross s'appliquer avec des valeurs comme source de table. pour SQL Server2008 + Fort> P> DECLARE @cols nvarchar( max),
@query nvarchar(max)
SELECT @cols =
STUFF((SELECT ',' + QUOTENAME(t.DatePeriod) AS ColName
FROM dbo.test62 t
FOR XML PATH(''), TYPE).value ('.', 'nvarchar(max)'), 1, 1, '')
SET @query =
'SELECT *
FROM (
SELECT t.DatePeriod, COALESCE(o.Transactions, o.Customers, o.Visits) AS PvtVals, o.PvtColumns, o.OrderColumns
FROM dbo.test62 t CROSS APPLY (
SELECT t.Transactions, NULL, NULL, ''Transaction'', 1
UNION ALL
SELECT NULL, t.Customers, NULL, ''Customers'', 2
UNION ALL
SELECT NULL, NULL, t.Visits, ''Visits'', 3
) o (Transactions, Customers, Visits, PvtColumns, OrderColumns)
) p
PIVOT
(
MAX(PvtVals) FOR DatePeriod IN (' + @cols + ')
) AS pvt
ORDER BY pvt.OrderColumns'
EXEC(@query)
Cross Appliquer ... Valeurs CODE> 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 ...) code>
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!
Si vous pouvez savoir combien de périodes de date à l'avance différentes, vous pouvez utiliser une requête fixe comme suit: 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
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)
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.
Pour obtenir le résultat que vous souhaitez avoir besoin de tout d'abord L'impulsion va transformer le multiple Colonnes de La requête pour impuche la Les données sont les suivantes: p> impublard code> les données, puis
pivotez les valeurs code> datéperiod`.
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>
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
Vérifiez la version pivot dynamique dans la réponse de Bluefeet sur Stackoverflow.com/Questtions/13372276/...