SQL Dynamic Pivot - как упорядочить столбцы

Я работаю над динамическим сводным запросом к таблице, которая содержит:

OID - OrderID Size - size of the product BucketNum - the order that the sizes should go quantity - how many ordered

Столбец размера содержит разные размеры в зависимости от OID.

Итак, используя найденный кодВотЯ положил это вместе:

DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)

SELECT  @listCol = STUFF(( SELECT distinct  '], [' + [size]
                           FROM     #t
                         FOR
                           XML PATH('')
                         ), 1, 2, '') + ']'


SET @query = 'SELECT * FROM
      (SELECT OID,  [size], [quantity]
            FROM #t 
            ) src
PIVOT (SUM(quantity) FOR Size
IN (' + @listCol + ')) AS pvt'


EXECUTE ( @query )

Это прекрасно работает, за исключением того, что заголовки столбцов (метки размеров) расположены не в том порядке, который основан на столбце bucketnum. В порядке в зависимости от размеров.

Я пробовал опциональный Order By после поворота, но это не работает.

Как контролировать порядок появления столбцов?

Спасибо

Ответы на вопрос(4)

Решение Вопроса

SELECT  @listCol = STUFF(( SELECT distinct  '], [' + [size]
                           FROM     #t
                         FOR
                           XML PATH('')
                         ), 1, 2, '') + ']'

Чтобы вернуть столбцы в правильном порядке. Возможно, вам придется сделать что-то подобное, а не использоватьDISTINCT:

SELECT [size]
FROM     #t
GROUP BY [size]
ORDER BY MIN(BucketNum)
 GernBlandston13 июл. 2009 г., 23:30
Ahhhhh! «MIN (BucketNum)»; немного было то, что мне нужно !! Спасибо Спасибо!
SELECT @listCol = STUFF(
        (SELECT DISTINCT ',' + QUOTENAME(size) AS [size]
        FROM #t
        ORDER BY [size]
        FOR XML PATH('')
 11 июн. 2015 г., 19:41
Хотя этот запрос может ответить на вопрос, можете ли вы предоставить немного больше информации о том, как этот ответ работает?
 11 июн. 2015 г., 23:19
Он работает так же, как и код в исходном сообщении, но создает псевдоним для столбца, так что к нему может быть применен ORDER BY.

которая использует CTE для построения списка столбцов (который, по-видимому, вы могли бы заказать) на лету без необходимости динамического sql:

http://blog.stevienova.com/2009/07/13/using-ctes-to-create-dynamic-pivot-tables-in-sql-20052008/

 GernBlandston13 июл. 2009 г., 23:54
Спасибо, Джоэл. Я не видел это, но я проверю это!
 14 июл. 2009 г., 00:02
Это решение не является динамическим только в именах столбцов, а не в количестве столбцов, которые все еще будут нуждаться в динамическом методе во время операции поворота. Я использовал эту технику для поворота переменных диапазонов дат, однако там, где они всегда 12 месяцев, но начинаются в разные месяцы, - это основное скользящее преобразование.

и я попробовал решение, предложенное выше, но, вероятно, из-за моего уровня понимания, я не смог заставить его работать. Я обнаружил, что простым взломом было создать таблицу Temp с правильно упорядоченными заголовками столбцов, используя операторы Order by, а затем включить в этот список переменную, которая задает имена столбцов динамического сводного запроса.

например

SELECT WeekNum INTO #T3 
FROM #T2 
GROUP BY WeekNum 
ORDER BY MIN(WeekNum) 

SELECT @ColumnName1 = ISNULL(@ColumnName1 + ',','') + QuoteName(WeekNum) 
FROM (SELECT WeekNum From #T3) AS WeekNum

Работал лакомство

Надеюсь, что это помогает кому-то.

Ваш ответ на вопрос