Pivot без агрегатной функции в sql server

У меня есть одна таблица с кодом и столбцом описания. Строки должны динамически переноситься в столбцы Бывший

Create Table #table(Code Varchar(15), Code_Desc Varchar(30))

Insert Into #table Values('T01', 'Desc1') 
Insert Into #table Values('T02', 'Desc2')
Insert Into #table Values('T03', 'Desc3')
Insert Into #table Values('T04', 'Desc4')

Select * from #table 

Code    Code_Desc 
T01 Desc1
T02 Desc2
T03 Desc3
T04 Desc4

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

Code    T01 T02 T03 T04 
Code_Desc Desc1 Desc2   Desc3   Desc4 

Спасибо

Почему без агрегатной функции?

gotqn 26.10.2018 08:29

Есть несколько агрегатов, которые, если вы передадите им одно значение, возвращают то же значение, что и их результат. Таким образом, нет необходимости «разворачивать без агрегатов», если вы не делаете что-то очень странное.

Damien_The_Unbeliever 26.10.2018 08:31
1
2
137
3

Ответы 3

Вы можете попробовать ниже

ДЕМО

select 'Code_Desc' as code,[T01], [T02], [T03], [T04] from #table
   pivot(max(Code_Desc) for code in ([T01], [T02], [T03], [T04]))pv

ВЫХОД:

code        T01      T02    T03     T04
Code_Desc   Desc1   Desc2   Desc3   Desc4

Для динамического поворота вы можете попробовать следующее:

declare @sql varchar(max)='',@col_list varchar(8000)=''

set @col_list = (select distinct quotename([Code])+',' from #table
for xml path(''))

set @col_list = left (@col_list,len(@col_list)-1)

set @sql = 'select '+@col_list+' from
#table
pivot (max([Code_Desc]) for [Code] in ('+@col_list+'))pv'

exec(@sql)

pivot динамически ссылаться на значение строки вместо [T01], [T02] как

Boopathi 26.10.2018 08:35

@Boopathi, да, для динамического поворота вам не нужно значение строки

Fahmi 26.10.2018 08:36

@Boopathi, я обновил свой ответ для динамического поворота - вы можете проверить

Fahmi 26.10.2018 08:47

Невозможно выполнить PIVOT без агрегирования.

CREATE TABLE #table1
(
    TEST_NAME VARCHAR(10),
    SBNO VARCHAR(10),
    VAL VARCHAR(10)
);

INSERT INTO #table1 (TEST_NAME, SBNO, VAL)
VALUES ('Test1' ,'1', '0.304'),
       ('Test1' ,'2', '0.31'),
       ('Test1' ,'3', '0.306'),
       ('Test2' ,'1', '2.3'),
       ('Test2' ,'2', '2.5'),
       ('Test2' ,'3', '2.4'),
       ('Test3' ,'1', 'PASS'),
       ('Test3' ,'2', 'PASS')

WITH T AS
(
    SELECT SBNO, VAL, TEST_NAME    
      FROM #table1
) 
SELECT *
  FROM T
 PIVOT (MAX(VAL) FOR TEST_NAME IN([Test1], [Test2], [Test3])) P

Вращение без использования агрегатных функций

Create Table #table(Code Varchar(15), Code_Desc Varchar(30))    
Insert Into #table Values('T01', 'Desc1') 
Insert Into #table Values('T02', 'Desc2')
Insert Into #table Values('T03', 'Desc3')
Insert Into #table Values('T04', 'Desc4')        

SELECT DISTINCT dt.Code,T01,T02,T03,T04 
FROM #table 
CROSS APPLY ( VALUES ('Code_Desc','Desc1','Desc2','Desc3','Desc4'  ) ) dt (Code,T01,T02,T03,T04)

Динамический подход Sql

DECLARE @SQL Nvarchar(max)
        ,@Columns nvarchar(max)
        ,@Columns2 nvarchar(max)
        ,@Columns3 nvarchar(max)

SELECT @Columns =STUFF((SELECT ', '+''''+ Code_Desc+'''' FROM #table FOR XML PATH ('')),1,1,'')
SELECT @Columns2=STUFF((SELECT ', '+ Code FROM #table FOR XML PATH ('')),1,1,'')
SELECT @Columns3=STUFF((SELECT ', '+ 'dt.'+QUOTENAME(Code) FROM #table FOR XML PATH ('')),1,1,'')


SET @SQL='SELECT DISTINCT dt.[Code],'+@Columns3+'
FROM #table
CROSS APPLY (VALUES(''Code_Desc'','+@Columns+'))'+CHAR(13)+CHAR(10)+' dt( Code,'+@Columns2+')'

PRINT @SQL
EXEC (@SQL)

Результат

Code        T01     T02     T03     T04
-------------------------------------------
Code_Desc   Desc1   Desc2   Desc3   Desc4

Другие вопросы по теме