求SELECT语句?

particular 2003-12-12 11:07:01

  field1 field2 field3
单位1  费用1  10
  单位1  费用2  20

单位2  费用1  11
  单位2  费用2  22
.
.
单位n  费用1  13
  单位n  费用2  21

  field1 field2 field3 field4 
   单位1  单位2 单位3 ..
  费用1  10    11   12 
费用2  20    22   13
关键是单位数不确定,不知用SELECT语句能实现不,或者大家给个思路也可以  


...全文
14 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
victorycyz 2003-12-12
这种贴子太多了,以致于高手们可以象百米赛跑一样比回贴的速度。

:D
  • 打赏
  • 举报
回复
LoveSQL 2003-12-12
看看有关行列转换的帖子,会有帮助。。。
  • 打赏
  • 举报
回复
zjcxc 元老 2003-12-12
--如果单位很多,可以导致上面的处理方法出错,这时用下面的

declare @sqlhead nvarchar(4000),@sqlend nvarchar(4000)
,@sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
,@i int,@ic varchar(20)

--生成数据处理临时表
select id=identity(int,0,1),gid=0
,a=',['+field1+']=sum(case field1 when '''+field1+''' then field3 else 0 end)'
into # from(select distinct field1 from 表)a

--判断需要多少个变量来处理
select @i=max(len(a)) from #
set @i=3800/@i

--分组临时表
update # set gid=id/@i
select @i=max(gid) from #

--生成数据处理语句
select @sqlhead='''select field2'''
,@sqlend=''' from 表 group by field2'''
,@sql1='',@sql2='select ',@sql3='',@sql4=''

while @i>=0
select @ic=cast(@i as varchar),@i=@i-1
,@sql1='@'+@ic+' nvarchar(4000),'+@sql1
,@sql2=@sql2+'@'+@ic+'='''','
,@sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic
+char(13)+@sql3
,@sql4=@sql4+',@'+@ic

select @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13)
,@sql2=left(@sql2,len(@sql2)-1)+char(13)
,@sql3=left(@sql3,len(@sql3)-1)
,@sql4=substring(@sql4,2,4000)

--执行
exec( @sql1+@sql2+@sql3+'
exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
)

--删除临时表
drop table #
go
  • 打赏
  • 举报
回复
zjcxc 元老 2003-12-12
--下面是数据测试

--测试数据
create table 表(field1 varchar(10),field2 varchar(10),field3 int)
insert into 表
select '单位1','费用1',10
union all select '单位1','费用2',20
union all select '单位2','费用1',11
union all select '单位2','费用2',22
union all select '单位n','费用1',13
union all select '单位n','费用2',21
go

--查询处理
declare @s varchar(8000)
set @s=''
select @s=@s+',['+field1+']=sum(case field1 when '''+field1+''' then field3 else 0 end)'
from(select distinct field1 from 表)a
exec('select field2'+@s+' from 表 group by field2')
go

--删除测试环境
drop table 表

/*--测试结果
field2 单位1 单位2 单位n
---------- ----------- ----------- -----------
费用1 10 11 13
费用2 20 22 21

--*/
  • 打赏
  • 举报
回复
txlicenhe 2003-12-12

测试:
create table 表名 (field1 varchar(10),field2 varchar(10),field3 int)
insert 表名 select '单位1','费用1',10
union all select '单位1','费用2',20
union all select '单位2','费用1',11
union all select '单位2','费用2',22
union all select '单位n','费用1',13
union all select '单位n','费用2',21


declare @sql varchar(8000)
set @sql = 'select field2'
select @sql = @sql + ',sum(case field1 when '''+field1+''' then field3 end) ['+field1+']'
from (select distinct field1 from 表名) as a
select @sql = @sql+' from 表名 group by field2'
exec(@sql)
field2 单位1 单位2 单位n
---------- ----------- ----------- -----------
费用1 10 11 13
费用2 20 22 21
  • 打赏
  • 举报
回复
zjcxc 元老 2003-12-12
declare @s varchar(8000)
set @s=''
select @s=@s+',['+field1+']=sum(case field1 when '''+field1+''' then field3 else 0 end)'
from(select distinct field1 from 表)a
exec('select field2'+@s+' from 表 group by field2')
  • 打赏
  • 举报
回复
snowolf_ren 2003-12-12
同意樓上的
  • 打赏
  • 举报
回复
txlicenhe 2003-12-12

declare @sql varchar(8000)
set @sql = 'select field2'
select @sql = @sql + ',sum(case field1 when '''+field1+''' then field3 end) ['+field1+']'
from (select distinct field1 from 表名) as a
select @sql = @sql+' from 表名 group by field2'
exec(@sql)


http://expert.csdn.net/Expert/topic/2440/2440306.xml?temp=.6941645
[交流]行列转换
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2003-12-12 11:07
社区公告
暂无公告