#sql-server #pivot #dynamic-pivot
#sql-сервер #свод #dynamic-pivot
Вопрос:
Я создал временную таблицу со всеми данными, которые я хочу. Затем я извлекаю данные с помощью динамической сводки и пытаюсь выяснить, как сортировать по строкам, затем по сводным столбцам. У меня есть сортировка строк, но я не могу понять, как сортировать по сводным столбцам.
SET @COLS = N'';
SET @COLS2 = N'';
SELECT @COLS = N', ISNULL(' QUOTENAME(PivotedName) ',0) AS ' QUOTENAME(PivotedName), @COLS2 = N', ' QUOTENAME(PivotedName)
FROM (SELECT DISTINCT(PivotedName) FROM #TEMP1 T1) AS X;
SET @SQL = N'
SELECT [ID#],[Name],' STUFF( @COLS, 1, 2, '') '
FROM
(
SELECT T1.[ID#], T1.[Name], T1.PivotedName, T1.PivotedAggregate FROM #TEMP1 T1
) AS C
PIVOT
(
MAX(PivotedAggregate) FOR PivotedName IN (' STUFF(REPLACE(@COLS2, ', [', ',['), 1, 1, '') ')
) AS P
ORDER BY [ID#] DESC
;';
EXECUTE SP_EXECUTESQL @SQL;
Результаты возвращаются следующим образом, где они отсортированы по идентификатору # DESC, который я хочу. Но, во-вторых, я бы хотел, чтобы они были отсортированы по «PivotName», но не в алфавитном порядке, фактически по другому столбцу «SortOrder», который доступен в #TEMP1.
Фактические результаты:
ID# Name PivotName1 PivotName4 PivotName3 PivotName2
10 Jon 10 0.91 9 0.91
9 Jane 8 15.8 14 0.8
8 Tom 6 0.84 6 0.84
7 Steve 3.37 0.85 37.5 0.99
6 Bob 0.75 0.73 0.75 0.73
Желаемые результаты:
ID# Name PivotName1 PivotName2 PivotName3 PivotName4
10 Jon 10 0.91 9 0.91
9 Jane 8 0.8 14 15.8
Комментарии:
1. Похоже, вам просто нужно добавить
ORDER BY
в свойSELECT @COLS
оператор ….2. Не могли бы вы показать мне пример? Все, что я пробовал, выдает ошибки. Я прочитал некоторые рекомендации о том, что он должен включать XML, о котором я знаю очень мало.
Ответ №1:
Как я уже сказал, вам нужно добавить ORDER BY
. Просто измените:
SELECT @COLS = N', ISNULL(' QUOTENAME(PivotedName) ',0) AS ' QUOTENAME(PivotedName), @COLS2 = N', ' QUOTENAME(PivotedName)
FROM (SELECT DISTINCT(PivotedName) FROM #TEMP1 T1) AS X;
Для
SELECT @COLS = N', ISNULL(' QUOTENAME(PivotedName) ',0) AS ' QUOTENAME(PivotedName), @COLS2 = N', ' QUOTENAME(PivotedName)
FROM (SELECT DISTINCT(PivotedName) FROM #TEMP1 T1) AS X ORDER BY PivotedName;
Комментарии:
1. Спасибо вам за это. Я вижу, что я был недостаточно ясен. Я не хочу упорядочивать по PivotedName, я хочу упорядочить по другому полю в #TEMP1, которое мне на самом деле не нужно возвращать в моих данных.
2. Вы не можете упорядочить свои данные по столбцу, который не существует в dataset @userKW .
Ответ №2:
SELECT @COLS = N', ISNULL(' QUOTENAME(PivotedName) ',0) AS ' QUOTENAME(PivotedName), @COLS2 = N', ' QUOTENAME(PivotedName)
FROM (SELECT DISTINCT(PivotedName), SortOrder FROM #TEMP1 T1) AS X ORDER BY SortOrder;
Разобрался. Я извлек сортировщик из временной таблицы для сортировки, но не использовал его в своем окончательном sql. Спасибо за обсуждение.