use master
go
create database upbs_test
go
use upbs_test
go
create table tb_goods
(
id int identity(1,1) primary key,
oid varchar(20),
cnt int,
price money,
tp varchar(20)
)
go
insert into tb_goods values('G1',2,5,'Ta')
insert into tb_goods values('G1',2,5,'Tb')
insert into tb_goods values('G1',1,7,'Tc')
insert into tb_goods values('G2',2,2,'Ta')
insert into tb_goods values('G2',3,8,'Tb')
insert into tb_goods values('G2',1,6,'Tc')
insert into tb_goods values('G2',1,9,'Ta')
insert into tb_goods values('G2',3,1,'Tb')
insert into tb_goods values('G3',1,9,'Tc')
insert into tb_goods values('G3',6,4,'Ta')
insert into tb_goods values('G5',8,3,'Tb')
insert into tb_goods values('G5',2,1,'Tc')
insert into tb_goods values('G5',9,6,'Ta')
insert into tb_goods values('G6',3,3,'Tb')
insert into tb_goods values('G6',2,5,'Tc')
insert into tb_goods values('G1',8,3,'Ta')
insert into tb_goods values('G2',2,1,'Tb')
insert into tb_goods values('G3',9,6,'Tc')
insert into tb_goods values('G4',3,3,'Ta')
insert into tb_goods values('G5',2,5,'Tb')
insert into tb_goods values('G6',2,5,'Tc')
insert into tb_goods values('G7',3,3,'Ta')
insert into tb_goods values('G7',2,5,'Tb')
insert into tb_goods values('G8',3,3,'Tc')
----------------------------------------------------------------------------------------------------------------------------------
---first step
select oid,
(case tp when 'ta' then isnull(cp, 0) end) as ta,
(case tp when 'tb' then isnull(cp, 0) end) as tb,
(case tp when 'tc' then isnull(cp, 0) end) as tc
from viw_g
---second step
select oid,
sum(ta) as ta,
sum(tb) as tb,
sum(tc) as tc
from
(
select oid,
(case tp when 'ta' then isnull(cp, 0) end) as ta,
(case tp when 'tb' then isnull(cp, 0) end) as tb,
(case tp when 'tc' then isnull(cp, 0) end) as tc
from (select oid,sum(cnt*price) cp,tp from tb_goods group by oid,tp) as s
) as b
group by oid
-----------------------------------------------------------------------------------------------------------
利用游标动态拼接SQL语句
declare myCur cursor for select distinct tp from tb_goods
declare
@tp varchar(20),
@sum varchar(300),
@case varchar(500),
@sql nvarchar(1000)
set @sum = ''
set @case = ''
set @sql = ''
open myCur
fetch next from myCur into @tp
while @@fetch_status =0
begin
print @tp
set @sum = @sum + 'sum(' + @tp + ') as ' + @tp +','
set @case = @case + '(case tp when ''' + @tp + ''' then isnull(cp,0) end) as ' + @tp +','
fetch next from myCur into @tp
end
close myCur
deallocate myCur
if right(@case,1) = ','
set @case = stuff(@case, len(@case), 1, ' from (select oid,sum(cnt*price) cp,tp from tb_goods group by oid,tp) as s')
if right(@sum,1) = ','
set @sum = stuff(@sum,len(@sum),1,'')
set @sql = 'select oid, ' + @sum + ' from ( select oid, ' + @case + ') as b group by oid'
execute sp_executesql @sql
【execute sp_executesql @sql-->也可写成 exec(@sql) 】
可以参考一下http://weblogs.asp.net/salimfayad/archive/2008/01/30/rows-to-columns.aspx
本文介绍了一种使用T-SQL通过动态拼接SQL语句实现数据聚合的方法。该方法利用游标遍历特定字段,并构建动态SQL来实现不同类别数值的求和操作。这种方法在面对变化的数据结构时具有较高的灵活性。

被折叠的 条评论
为什么被折叠?



