Ето как бих направил това:
/*
create table ##order ( ID int, ProdID int, Quantity int, [Date] date, CustID int, StoreID int );
insert into ##order values (1,1,5,'2011-01-10' ,12,1), (2,2,10,'2011-03-10',4 ,1), (3,3,8,'2011-03-10' ,5 ,1), (4,4,11,'2011-05-10',4 ,2), (5,5,5,'2011-05-10' ,14,2), (6,6,8,'2011-06-10' ,3 ,3);
create table ##product (ProdID int, ProdName varchar(64), ProdDesc varchar(255), ProdType int);
insert into ##product values (1,'Bananas','Chiquita',1), (2,'Apples','Green Apples',1), (3,'Grapes','Green Grapes',1), (4,'Potatoes','Idaho potatoes',2), (5,'Brocolli','Green Brocolli',2), (6,'Plates','Paper Plates',3);
create table ##ProdType (TypeID int, Name varchar(64), [Desc] varchar(255));
insert into ##ProdType values (1,'Fruits','Fresh Fruits'),(2,'Vegetables','Fresh Veggies'),(3,'Kitchen','Kitchen stuff');
create table ##loc (loc_id int, city varchar(50), [state] varchar(50))
insert into ##loc values(1, 'Atlanta','GA'), (2, 'New york', 'NY'), (3, 'Chicago', 'IL');
*/
declare @cmd varchar(max), @columns varchar(max)
set @columns = ''
select @columns = @columns + '['+Name+'],' from ##ProdType order by name asc
select @columns = substring(@columns, 0, len(@columns))
set @cmd = '
select city, date,'[email protected]+' from
(
select
ct.city,
ord.Date,
pt.Name,
ord.Quantity
from
##order ord
join ##product pr on ord.ProdID = pr.ProdID
join ##ProdType pt on pr.ProdType = pt.TypeID
join ##loc ct on ord.StoreID = ct.loc_id
)date_to_pivot
PIVOT
(
SUM(Quantity) for Name in ('[email protected]+')
)PIVOTED_DATA'
exec (@cmd)
Ето разширението, използващо операторите case:
set @columns = ''
select @columns = ''
select @columns = @columns + 'sum(case when pt.Name = '''+Name+''' then ord.Quantity else 0 end) as '+Name+'_SUM,' from ##ProdType order by name asc
select @columns = @columns + 'count(case when pt.Name = '''+Name+''' then ord.Quantity else 0 end) as '+Name+'_COUNT,' from ##ProdType order by name asc
select @columns = substring(@columns, 0, len(@columns))
set @cmd = '
select
ct.city,
ord.Date, '
[email protected]+
'
from
##order ord
join ##product pr on ord.ProdID = pr.ProdID
join ##ProdType pt on pr.ProdType = pt.TypeID
join ##loc ct on ord.StoreID = ct.loc_id
group by
ct.city,
ord.Date'
exec (@cmd)