I wouldn't recommend using "pivot" for this need. Although this may at first look complex, it will be easier to achieve your output using "conditional aggregates" (case expressions inside an aggregate function):
SELECT
ID
, No
, MAX(CASE WHEN Name = 'A1' THEN Name END) AS Name1
, MAX(CASE WHEN Name = 'A1' THEN Letter END) AS Letter1
, MAX(CASE WHEN Name = 'A1' THEN Answer END) AS Answer1
, MAX(CASE WHEN Name = 'A1' THEN CMT END) AS CMT1
, MAX(CASE WHEN Name = 'A2' THEN Name END) AS Name2
, MAX(CASE WHEN Name = 'A2' THEN Letter END) AS Letter2
, MAX(CASE WHEN Name = 'A2' THEN Answer END) AS Answer2
, MAX(CASE WHEN Name = 'A2' THEN CMT END) AS CMT2
, MAX(CASE WHEN Name = 'A3' THEN Name END) AS Name3
, MAX(CASE WHEN Name = 'A3' THEN Letter END) AS Letter3
, MAX(CASE WHEN Name = 'A3' THEN Answer END) AS Answer3
, MAX(CASE WHEN Name = 'A3' THEN CMT END) AS CMT3
, MAX(CASE WHEN Name = 'A4' THEN Name END) AS Name4
, MAX(CASE WHEN Name = 'A4' THEN Letter END) AS Letter4
, MAX(CASE WHEN Name = 'A4' THEN Answer END) AS Answer4
, MAX(CASE WHEN Name = 'A4' THEN CMT END) AS CMT4
FROM mytable
GROUP BY
ID
, No
;
For dynamic sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
;
SET @cols = STUFF((SELECT DISTINCT ',' +
'MAX(CASE WHEN Name = ''' + Name + ''' THEN Name END) AS [Name' + Name + '],' +
'MAX(CASE WHEN Name = ''' + Name + ''' THEN Letter END) AS [Letter' + Name + '],' +
'MAX(CASE WHEN Name = ''' + Name + ''' THEN Answer END) AS [Answer' + Name + '],' +
'MAX(CASE WHEN Name = ''' + Name + ''' THEN CMT END) AS [CMT' + Name +']'
FROM mytable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @query = 'SELECT ID, No,' + @cols +
' FROM mytable GROUP BY ID, No'
EXECUTE(@query);
ID |
No |
NameA1 |
LetterA1 |
AnswerA1 |
CMTA1 |
NameA2 |
LetterA2 |
AnswerA2 |
CMTA2 |
NameA3 |
LetterA3 |
AnswerA3 |
CMTA3 |
NameA4 |
LetterA4 |
AnswerA4 |
CMTA4 |
123 |
103 |
A1 |
A |
Low |
Abc |
A2 |
B |
High |
Abc |
A3 |
A |
Medium |
Cde |
A4 |
C |
Low |
Hhj |
fiddle