Проблема PIVOT при преобразовании 4 строк (1 столбец) в 5 столбцов (1 строка) - PullRequest
1 голос
/ 19 августа 2010

У меня есть таблица var с несколькими строками, но только один столбец типа DATETIME, например:

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

Мне нужно показать в некоторых столбцах, но только в одной строке. Мой набор результатов будет ограничен 5 строками, тогда я могу ограничить до 5 столбцов. Пример того, что мне нужно:

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

Я пытался сделать это с помощью PIVOT в SQL Server 2005. Но во всех примерах для агрегирования значений используется больше столбцов, тогда я не понимаю.

Это запрос, который я пытался:

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

Но результат равен NULL:

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

Может кто-нибудь показать мне, что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Row_Number() просто возвращает число в списке 1-5, поэтому оно не будет совпадать с чем-либо в вашем списке "День1, День2, День3, День4, День5". Я добавил «День» на передний план, так что это будет.

Кроме того, у вас есть MIN(Line) FOR Day IN, это должно быть наоборот. Это значение Day, которое вы хотите отобразить.

;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
1 голос
/ 19 августа 2010

Вот еще одно решение, в котором не используется оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...