In SQL Server you can also write dynamic pivot. Specially it's great when you don't know all the name of the pivoted columns.
Schema and insert statements:
create table tablename(Person varchar(50), Value int, Type varchar(50));
insert into tablename values('John',10,'TypeA');
insert into tablename values('John',10,'TypeA');
insert into tablename values('John',20,'TypeB');
insert into tablename values('John',20,'TypeB');
insert into tablename values('Steve',15,'TypeA');
insert into tablename values('Steve',15,'TypeA');
insert into tablename values('Steve',25,'TypeB');
insert into tablename values('Steve',25,'TypeB');
Query:
DECLARE @cols AS NVARCHAR(MAX)='';
DECLARE @query AS NVARCHAR(MAX)='';
select @cols=string_agg(type,',') within group (order by type)
from
(select distinct type from tablename)t
set @query =
'SELECT Person, ' + @cols + ' from
(
select * from tablename
) src
pivot
(
sum(value) for Type in (' + @cols + ')
) piv
order by Person'
execute(@query)
Output:
| Person |
TypeA |
TypeB |
| John |
20 |
40 |
| Steve |
30 |
50 |
fiddle