Как упорядочить известные значения как столбцы в Dynamic Pivot и новые до конца? - PullRequest
1 голос
/ 07 мая 2019

Я настраиваю динамический круг, где столбцы (идентификаторы отделов) должны быть в установленном порядке, а любые новые значения, которые будут создавать столбец, должны находиться в конце таблицы.Я установил порядковый номер для «известных» отделов, и любые новые отделы получают следующий номер в последовательности.Мне нужно, чтобы идентификаторы отделов были заголовками, но они мне нужны в порядке порядкового номера.

1) Я развернул номер последовательности:

FROM (SELECT DISTINCT [SEQ] FROM #TABLE) AS [SEQ]
ORDER BY  [SEQ]

SET @DynamicPivotQuery = 
  N'SELECT [DATE], ' + @ColumnName + '
    FROM #TABLE
    PIVOT(SUM([COUNT]) 
          FOR [SEQ] IN (' + @ColumnName + ')) AS PVTTable
          ORDER BY [DATE]'

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

Это выходит вправильный порядок, но порядковый номер - это заголовок столбца

2) Я также повернулся на отделе, но столбцы в последовательности с идентификатором отдела:

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME([DEPT_ID])

FROM (SELECT DISTINCT [DEPT_ID] FROM #TABLE) AS [DEPT_ID]
ORDER BY  [DEPT_ID]

SET @DynamicPivotQuery = 
  N'SELECT [DATE], ' + @ColumnName + '
    FROM #TABLE
    PIVOT(SUM([COUNT]) 
          FOR [DEPT_ID] IN (' + @ColumnName + ')) AS PVTTable
          ORDER BY [DATE]'

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

Данные /таблица, которая готова к повороту:

SEQ    DEPT     DATE     COUNT
----------------------------------
1       8       1/1/2019  5      (Dept 8 is known Dept)
1       8       1/2/2019  7
2       3       1/1/2019  6      (Dept 3 is known Dept)
2       3       1/2/2019  4
3       1       1/1/2019  7      (Dept 1 is an unknown dept)
3       1       1/2/2019  3  

Результаты, которые я хочу увидеть:

DATE        8     3     1
----------------------------------
1/1/2019    5     6     7
1/2/2019    7     4     3

Или как изображение:

enter image description here

1 Ответ

0 голосов
/ 07 мая 2019

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

-- declare the variables.
DECLARE @ColumnName NVARCHAR(MAX)
DECLARE @DynamicQuery NVARCHAR(MAX)

-- set the columns (ORDER BY SEQ).
SET @ColumnName = STUFF((
    SELECT ',' + QUOTENAME(CONVERT(VARCHAR(10), DEPT))
    FROM table_name
    GROUP BY SEQ, DEPT
    ORDER BY SEQ
    FOR XML PATH('')
) , 1 , 1 , '')

-- set the pivot query to get the result.
SET @DynamicQuery = N'
    SELECT [DATE], ' + @ColumnName + '
    FROM (
        SELECT DEPT, DATE, COUNT
        FROM table_name
    ) st PIVOT(
        SUM([COUNT]) 
        FOR [DEPT] IN (' + @ColumnName + ')
    ) pt
    ORDER BY [DATE]'

-- execute the dynamic query.
EXEC sp_executesql @DynamicQuery

демо на dbfiddle.uk


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

-- pivot query without specific order of columns.
SELECT DATE, [8], [3], [1]  
FROM (
    SELECT DEPT, DATE, COUNT
    FROM table_name
) st PIVOT (  
    SUM(COUNT)
    FOR DEPT IN ([8], [3], [1])   
) pt
ORDER BY [DATE];
...