Я использовал приведенный выше код из ссылки. Но я получаю ошибку как

Сообщение 8156, уровень 16, состояние 1, строка 14 Столбец «Завод» был указан несколько раз для «p»

Эффективно конвертировать строки в столбцы на сервере SQL

Вот моя таблица:

ТЕСТ

ID      score    Check      TotalofScore
------  -----    -------    ------------
867439  1        factory        1
867439  1        Plant          1
867442  1        factory        1
867442  1        Plant          1
923991  1        Warehouse      1
923991  1        Plant          1
923930  1        factory        1
923930  1        Plant          1
923101  1        Warehouse      1
923101  1        Plant          1

Вот моя попытка

DECLARE @cols  AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SELECT @cols = Stuff((SELECT ',' + Quotename([check])
                      FROM   TEST
                      GROUP  BY [Check],
                                [ID]
                      ORDER  BY [ID]
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = N'SELECT ' + @cols + N' from 
             (SELECT TEST.[ID],
                     Score,
                     [check],
                     [Total Of Score] = Count(TEST.Score) over(partition by [ID], [score], [check])
             FROM TEST) T
            pivot 
            (
             SUM (T.[score])
             for T.[check] in (' + @cols + N') ) p '

EXEC Sp_executesql @query; 

Ожидаемый результат :

ID       TotalofScore   factory     Plant   Warehouse
------   ------------   -------     -----   ---------
867439      1             1 
867439      1                                   1
867442      1                       1
867442      1                                   1
923991      1             1 
923991      1             1
923930      1                       1
923930      1                       1
923101      1              1
923101      1                                   1
0
WiredTheories 26 Дек 2014 в 14:47
Это был тот, с которым я хотел помочь.
 – 
WiredTheories
26 Дек 2014 в 14:48

2 ответа

Лучший ответ

Как упоминалось в разделе «Ошибка». Вы не можете указать одно и то же имя столбца более одного раза в Pivot, например

..pivot (SUM (T.[score]) for T.[check] in ([factory,[Plant],[factory]..))p

Измените инициализацию @cols следующим образом

SELECT @cols = Stuff((SELECT DISTINCT ',' + Quotename([check])
                      FROM   TEST
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

Или же

SELECT @cols = Stuff((SELECT ',' + Quotename([check])
                      FROM   TEST
                      GROUP  BY [Check]
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

Обновление: чтобы преобразовать динамический сводный график в процедуру и вставить результат в новую таблицу.

create procedure dbname.schemaname.DynamicPivotProcedure 
as
begin
DECLARE @cols  AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SELECT @cols = Stuff((SELECT ',' + Quotename([check])
                      FROM   TEST
                      GROUP  BY [Check]
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = N'SELECT ID, [Total Of Score],' + @cols + N' from 
             (SELECT TEST.[ID],
                     Score,
                     [check],
                     [Total Of Score] = Count(TEST.Score) over(partition by [ID], [score], [check])
             FROM TEST) T
            pivot 
            (
             SUM (T.[score])
             for T.[check] in (' + @cols + N') ) p '

EXEC Sp_executesql @query; 
end

go
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL 
begin
DROP TABLE #MyTempTable
end

SELECT * INTO #MyTempTable FROM 
OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC dbname.schemaname.DynamicPivotProcedure')

SELECT * FROM #MyTempTable
1
Pரதீப் 26 Дек 2014 в 19:32
SELECT @cols = Stuff((SELECT ',' + Quotename([check]) FROM TEST GROUP BY [Check] , [ID] ORDER BY [ID] FOR XML PATH(''), TYPE).value('.' , 'NVARCHAR(MAX)'), 1, 1, '')
 – 
WiredTheories
26 Дек 2014 в 15:04
- Mybad забыл удалить идентификатор из заказа, обновлена ​​​​проверка сейчас
 – 
Pரதீப்
26 Дек 2014 в 15:20
Это помогло. Могу ли я выполнить ту же задачу в представлении. Это динамический sql, я знаю, что его нельзя использовать в представлении. Но есть ли альтернативный способ выполнить ту же задачу
 – 
WiredTheories
26 Дек 2014 в 15:26
1
Да, вы можете проверить это stackoverflow.com/questions/653714/…
 – 
Pரதீப்
26 Дек 2014 в 17:32
1
Замените (local)\SQL2012 результатом select @@SERVERNAME и измените exec DynamicPivotProcedure на exec databasename.schemaname.DynamicPivotProcedure
 – 
Pரதீப்
26 Дек 2014 в 19:51

Удалите Id из условий GROUP BY и ORDER By. Так что вы получите столбцы проверки DISTINCT.

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME([check]) 
  from #Sample
  group by [Check]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
set @query = N'SELECT  ID, [Total Of Score], ' + @cols + N'  from 
             (
               SELECT 
TEST.[ID],
Score,
[check],
[Total Of Score] = Count(TEST.Score) over(partition by [ID], [score], [check])
FROM #Sample AS TEST
  ) T
  pivot 
  (
     SUM (T.[score])
      for T.[check] in (' + @cols + N')
  ) p '
exec sp_executesql @query;
1
Saravana Kumar 26 Дек 2014 в 15:16
Это работает, но я пропускаю столбцы ID и TotalOfScore,
 – 
WiredTheories
26 Дек 2014 в 15:13
@Lewan: добавьте столбцы в список выбора. Используйте обновленный ответ.
 – 
Saravana Kumar
26 Дек 2014 в 15:17
Идеально. «Я предполагал, что «+ cols + N» делает свое дело, поскольку в запросе подзапроса есть столбцы, упомянутые в нем. Я знаю, что это нельзя использовать в представлении. Но есть ли альтернатива выполнению той же задачи в представлении. Поскольку динамический sql часто не рекомендуется.
 – 
WiredTheories
26 Дек 2014 в 15:22