SQL PIVOT TABLE - PullRequest
       1

SQL PIVOT TABLE

1 голос
/ 15 июня 2011

У меня есть следующие данные:

ID       Data
1         tera
1         add
1         alkd
2         adf
2         add
3         wer
4         minus
4         add
4         ten

Я пытаюсь использовать сводную таблицу для переноса строк в 1 строку с несколькими столбцами для каждого идентификатора. Итак, следующим образом:

ID   Custom1     Custom2    Custom3   Custom4..........
1      tera       add         alkd      
2      adf        add
3      wer
4      minus      add          ten

У меня пока следующий запрос:

  INSERT INTO @SpeciInfo
(ID, [Custom1], [Custom2], [Custom3], [Custom4], [Custom5],[Custom6],[Custom7],[Custom8],[Custom9],[Custom10],[Custom11],[Custom12],[Custom13],[Custom14],[Custom15],[Custom16])
    SELECT 
        ID,
        [Custom1],
        [Custom2],
        [Custom3],
        [Custom4],
        [Custom5],
        [Custom6],
        [Custom7],
        [Custom8],
        [Custom9],
        [Custom10],
        [Custom11],
        [Custom12],
        [Custom13],
        [Custom14],
        [Custom15],
        [Custom16]
    FROM SpeciInfo) p
    PIVOT
    (
        (
            [Custom1],
            [Custom2], 
            [Custom3], 
            [Custom4],
            [Custom5],
            [Custom6],
            [Custom7],
            [Custom8],
            [Custom9],
            [Custom10],
            [Custom11],
            [Custom12],
            [Custom13],
            [Custom14],
            [Custom15],
            [Custom16]
        )
    ) AS pvt
    ORDER BY ID;

Мне нужно 16 полей, но я не совсем уверен, что я делаю в предложении From или правильно ли я это делаю?

Спасибо

1 Ответ

2 голосов
/ 15 июня 2011

Если вы ищете динамическое построение столбцов, это часто называется динамической кросс-таблицей и не может быть выполнено в T-SQL без обращения к динамическому SQL (построение строки запроса), что не рекомендуется.Вместо этого вы должны создать этот запрос в своем приложении среднего уровня или для создания отчетов.

Если вам просто нужно статическое решение, альтернатива использованию PIVOT того, что вы ищете, может выглядеть примерно так в SQL Server 2005 или более поздней версии:

With NumberedItems As
    (
    Select Id, Data
        , Row_Number() Over( Partition By Id Order By Data ) As ColNum
    From SpeciInfo
    )
Select Id
    , Min( Case When Num = 1 Then Data End ) As Custom1
    , Min( Case When Num = 2 Then Data End ) As Custom2
    , Min( Case When Num = 3 Then Data End ) As Custom3
    , Min( Case When Num = 4 Then Data End ) As Custom4
    ...
From NumberedItems
Group By Id

Одна серьезная проблема в вашем оригиналеданные состоят в том, что отсутствует индикатор последовательности, и, следовательно, у системы нет средств узнать, какой элемент для данного идентификатора должен отображаться в столбце Custom1, а не в столбце Custom2.В моем запросе выше я произвольно заказал по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...