Как упорядочить по строкам, затем столбцам, в динамическом своде

#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. Спасибо за обсуждение.