2010-08-18 4 views
1

J'ai une table var avec quelques lignes, mais une seule colonne de type DATETIME, comme ceci:problème PIVOT lors de la conversion 4 rangs (1 colonne) à 5 colonnes (1 ligne)

[Day] 
2010-08-03 
2010-08-04 
2010-08-10 
2010-08-11 

Je dois montrer sur certaines colonnes mais sur une seule ligne. Mon jeu de résultats sera limité à 5 lignes, alors je peux limiter à 5 colonnes aussi. Exemple de ce que je dois:

[Day1]  [Day2]  [Day3]  [Day4]  [Day5] 
2010-08-03 2010-08-04 2010-08-10 2010-08-11 NULL 

je tentais de le faire en utilisant PIVOT dans SQL Server 2005. Mais tous exemple utilise plusieurs colonnes à agréger des valeurs, alors je ne comprends pas.

C'est la requête que je voulais:

SELECT r.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY Day ASC) Line, Day FROM @MyDays) AS o 
PIVOT (MIN(Line) FOR Day IN (Day1, Day2, Day3, Day4, Day5)) AS r 

Mais le résultat est tout NULL:

[Day1] [Day2] [Day3] [Day4] [Day5] 
NULL NULL NULL NULL NULL 

Quelqu'un pourrait-il me montrer ce que je fais mal?

Répondre

3

Row_Number() renvoie juste un nombre dans la liste 1-5 de sorte qu'il ne correspondra à rien dans votre liste "Day1, Day2, Day3, Day4, Day5". J'ai ajouté "Day" sur le devant de sorte qu'il le fera. En outre, vous avez MIN(Line) FOR Day IN, Cela doit être l'inverse. C'est la valeur de Day que vous souhaitez afficher.

;with mydays as 
(

SELECT '2010-08-03' AS [Day] UNION 
SELECT '2010-08-04' AS [Day] UNION 
SELECT '2010-08-10' AS [Day] UNION 
SELECT '2010-08-11' AS [Day] 
) 
SELECT r.* FROM (
    SELECT 
     'Day' + CAST(ROW_NUMBER() OVER (ORDER BY Day ASC)as varchar(10)) Line, 
     Day 
    FROM mydays) AS o 
PIVOT (MIN([Day]) FOR Line IN (Day1, Day2, Day3, Day4, Day5)) AS r 
+0

Maintenant, je compris: les valeurs dans les lignes doivent être les mêmes que les noms de colonnes que je veux. Merci, a parfaitement fonctionné! –

1

Voici une autre solution qui ne comporte pas l'énoncé de Pivot:

With RawData As 
    (
    Select '2010-08-03' AS [Day] 
    Union All Select '2010-08-04' 
    Union All Select '2010-08-10' 
    Union All Select '2010-08-11' 
    ) 
    , NumberedItems As 
    (
    Select Day, Row_Number() Over(Order By Day) As Line 
    From RawData 
    ) 
Select Min (Case When Line = 1 Then [Day] End) As Day1 
    , Min (Case When Line = 2 Then [Day] End) As Day2 
    , Min (Case When Line = 3 Then [Day] End) As Day3 
    , Min (Case When Line = 4 Then [Day] End) As Day4 
    , Min (Case When Line = 5 Then [Day] End) As Day5 
From NumberedItems 
+0

Très intéressant, mais je pense que la syntaxe avec PIVOT est plus facile à lire. Y a-t-il un gain de performance considérable lorsque vous n'utilisez pas PIVOT? –

Questions connexes