Моето предложение винаги, когато работите с PIVOT, е винаги първо да пишете заявката с твърдо кодирани стойности, след което лесно можете да конвертирате заявката в динамично решение.
Тъй като ще имате множество стойности на columnC
които ще бъдат преобразувани в колони, тогава трябва да разгледате с помощта на row_number()
функция за създаване на прозорец за генериране на уникална последователност за всяка columnc
въз основа на стойностите на columnA
и колона B
.
Началната точка за вашата заявка ще бъде:
изберете [ColumnA], [ColumnB], [ColumnC], 'SampleTitle'+ cast(row_number() over(partition by columna, columnb ред по columnc) като varchar(10)) seqfr от DataSource;код>
Вижте Демо. Тази заявка ще генерира списък с имена на нови колони SampleTitle1
и т.н.:
След това можете да приложите централната част на columnC
с новите имена на колони, изброени в seq
:
изберете columnA, columnB, SampleTitle1, SampleTitle2, SampleTitle3from( изберете [ColumnA], [ColumnB], [ColumnC], 'SampleTitle'+ cast(row_number() over(partition by columna, columnb ред по columnc)) като varchar(10)) seq от DataSource) dpivot( max(columnc) за seq в (SampleTitle1, SampleTitle2, SampleTitle3)) piv;
Вижте SQL Fiddle с демонстрация.
След като имате правилната логика, можете да конвертирате данните в динамичен SQL. Ключът тук е генерирането на списък с имена на нови колони. Обикновено използвам ЗА XML PATH
за това подобно на:
изберете STUFF((SELECT different ',' + QUOTENAME(seq) from ( изберете 'SampleTitle'+ cast(row_number() over(partition by columna, columnb order by columnc) as varchar(10)) seq от DataSource ) d ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
Вижте Демо. След като имате списък с имена на колони, ще генерирате своя sql низ за изпълнение, пълният код ще бъде:
ДЕКЛАРИРАНЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((ИЗБЕРЕТЕ различен ',' + QUOTENAME(seq) от ( изберете 'SampleTitle'+ cast(row_number( ) over(partition by columna, columnb ред по columnc) като varchar(10)) seq от DataSource ) d FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1, 1,'')set @query ='ИЗБЕРЕТЕ колона A, ColumnB,' + @cols + ' от ( изберете [ColumnA], [ColumnB], [ColumnC], ''SampleTitle''+ cast(row_number() over(partition по columna, columnb ред по columnc) като varchar(10)) seq от DataSource ) x pivot ( max(columnc) f или seq в (' + @cols + ') ) p 'изпълни sp_executesql @query;
Вижте SQL Fiddle с демонстрация. Те дават резултат:
<предварителен код>| КОЛОНА | КОЛОНА | SAMPLETITLE1 | SAMPLETITLE2 | SAMPLETITLE3 ||--------|--------|--------------|------------ --|--------------|| 5060 | 1006 | 100118 | 100119 | 100120 || 5060 | 1007 | 100121 | 100122 | (нула) || 5060 | 1012 | 100123 | (нула) | (нула) |