Использование Pivoting в SQL Server (ошибка) — недопустимое имя столбца

SELECT 
    [Reg. number], [Surname], 
    [SESREFDATETIME1], [ATTENDANCE1], 
    [SESREFDATETIME2], [ATTENDANCE2],
    [SESREFDATETIME3], [ATTENDANCE3],
    [SESREFDATETIME4], [ATTENDANCE4] 
FROM
    (SELECT
        [Reg. number], [Surname], 
        col + CAST(rn AS varchar(10)) col, 
        value
     FROM
        (SELECT
            [Reg. number], Surname,
            row_number() over(partition by [Reg. number] order by SESREFDATETIME) rn
         FROM #Temp) t
     CROSS APPLY
         (SELECT 'SESREFDATETIME', SESREFDATETIME 
          UNION ALL 
          SELECT 'ATTENDANCE', ATTENDANCE) c (col, value)
    ) x
PIVOT
    (max(value)
     for col in ([SESREFDATETIME1], [ATTENDANCE1], [SESREFDATETIME2],[ATTENDANCE2], [SESREFDATETIME3], [ATTENDANCE3], [SESREFDATETIME4],[ATTENDANCE4])
    ) p;

В своей процедуре я создал временную таблицу #temp и попытался отобразить несколько строк в нескольких столбцах. Причина, по которой я использовал сводку, заключается в том, что этот код создается динамически, а количество строк неизвестно. Я запускаю код, но он выдает ошибку. Я сойду с ума. Не могу найти где ошибка. Он показывает, что в перекрестном применении указано недопустимое имя столбца. Я думаю, что есть еще одна ошибка. И он показывает ошибку не на той стороне. Для тестирования формат таблицы выглядит следующим образом

Create table #Temp
(
    [Reg. number] int, 
    [Surname] Varchar(50), 
    SESREFDATETIME Varchar(80), 
    ATTENDANCE Varchar(10)
)

Пример формата данных

2005162 Abasov  04/09/2014 09:00 - 10:00    Y
2005458 Baxşiyev    15/04/2015 01:00 - 04:00    NULL
2005458 Baxşiyev    16/09/2014 14:00 - 17:00    Y
2005538 Abbasbəyli  13/10/2014 12:00 - 15:00    Y

person Etibar - a tea bar    schedule 29.01.2015    source источник
comment
Пожалуйста, покажите все ошибки, которые вы получили, и попробуйте настроить демонстрацию для вашего запроса и примеров данных здесь sqlfiddle.com/#! 3 для игры   -  person Mahmoud Gamal    schedule 29.01.2015
comment
Я не мог использовать sqlfiddle. Ошибка создания схемы: не удается подключиться к источнику данных [sqlfiddle_mssql2]: сетевая ошибка IOException: соединение отклонено. Поэтому я изменил вопрос. Я надеюсь, что это даст вам некоторые идеи. Спасибо за ваш отзыв.   -  person Etibar - a tea bar    schedule 29.01.2015


Ответы (1)


Ваш «перекрестное применение x» не может видеть SESREFDATETIME и ATTENDANCE, если вы включите эти столбцы в свой «подвыбор t», часть перекрестного применения может получить значения

Попробуй это:

SELECT 
    [Reg. number], [Surname], 
    [SESREFDATETIME1], [ATTENDANCE1], 
    [SESREFDATETIME2], [ATTENDANCE2],
    [SESREFDATETIME3], [ATTENDANCE3],
    [SESREFDATETIME4], [ATTENDANCE4] 
FROM
    (SELECT
        [Reg. number], [Surname], 
        col + CAST(rn AS varchar(10)) col, 
        value
     FROM
        (SELECT
            [Reg. number], Surname,
            row_number() over(partition by [Reg. number] order by SESREFDATETIME) rn,
            SESREFDATETIME,
            ATTENDANCE
         FROM #Temp) t
     CROSS APPLY
         (SELECT 'SESREFDATETIME', SESREFDATETIME 
          UNION ALL 
          SELECT 'ATTENDANCE', ATTENDANCE) c (col, value)
    ) x
PIVOT
    (max(value)
     for col in ([SESREFDATETIME1], [ATTENDANCE1], [SESREFDATETIME2],[ATTENDANCE2], [SESREFDATETIME3], [ATTENDANCE3], [SESREFDATETIME4],[ATTENDANCE4])
    ) p;
person t-clausen.dk    schedule 29.01.2015
comment
Отлично. Большое спасибо и за ответ, и за объяснение. - person Etibar - a tea bar; 29.01.2015