create table #(a varchar(100),c varchar(10) , b int)
insert # values('aa','english' , 11)
insert # values('bb','chinese' , 1)
insert # values('aa','chinese' , 45)
insert # values('cc','english' , 81)
insert # values('a','english' , 11)
insert # values('aay','chinese' , 561)
insert # values('a','chinese' , 14)select * from #declare @sql varchar(8000)
set @sql = 'select c , '
select @sql = @sql + 'sum(case a when '''+a+'''
then b else 0 end) '+a +','
from (select distinct a from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by c'print @sql
exec (@sql)
drop table #
insert # values('aa','english' , 11)
insert # values('bb','chinese' , 1)
insert # values('aa','chinese' , 45)
insert # values('cc','english' , 81)
insert # values('a','english' , 11)
insert # values('aay','chinese' , 561)
insert # values('a','chinese' , 14)select * from #declare @sql varchar(8000)
set @sql = 'select c , '
select @sql = @sql + 'sum(case a when '''+a+'''
then b else 0 end) '+a +','
from (select distinct a from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by c'print @sql
exec (@sql)
drop table #
解决方案 »
- 请问SQL日志记录在哪里看??
- 用sql语句将数据库A中a表中的数据读入数据库B中b表中?
- 同表数据复制
- 怎么求一表中某列具有相同数据行?
- 急!!!SQL2005+JSP+TOMCAT 无法创建下列URL的连接,求高手帮忙!!!
- sqlserver 三千万数据量 group by 速度慢 求解 在线等
- SQL批量修改字段COLLATION值
- 这几天一直在写sql,但好些都写不出来。请各位老手帮忙写个sql(视图或存储过程,或好的建议)
- Sql server 中那种类型可以储存大量二进制数据
- CSDN上的一道題,我把它拿到MS News group 上去,結果……
- 一个数据插入的问题,请大家帮忙,谢谢
- 请教:如何复制 sql变量所指定 的记录行。
create table #(name varchar(100),subject varchar(10) , score int)
insert # values('張三','english' , 60)
insert # values('李四','chinese' , 80)
insert # values('張三','chinese' , 90)
insert # values('李四','english' , 100)
insert # values('王五','english' , 98)
insert # values('肖六','chinese' , 80)
insert # values('王五','chinese' , 75)select * from #declare @sql varchar(8000)
set @sql = 'select subject , '
select @sql = @sql + ' sum(case name when '''+name+'''
then score else 0 end) '+name +','
from (select distinct name from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by subject'print @sql
exec (@sql)
drop table #
insert # values('張三','english' , 60)
insert # values('李四','chinese' , 80)
insert # values('張三','chinese' , 90)
insert # values('李四','english' , 100)
insert # values('王五','english' , 98)
insert # values('肖六','chinese' , 80)
insert # values('王五','chinese' , 75)select * from #declare @sql varchar(8000)
set @sql = 'select subject , '
select @sql = @sql + ' nullif(sum(case name when '''+name+'''
then score else 0 end) , 0) '+name +','
from (select distinct name from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by subject'print @sql
exec (@sql)
drop table #
create table Score(Nameunion varchar(10),Subject varchar(10),Score varchar(10))
insert Score select '张三','语文',65
union all select '李四','数学',85
union all select '张三','英语',78
union all select '王二麻子','语文',75
union all select '张三','物理',88
go--查询的存储过程
create proc p_qry
@Nameunion varchar(4000)='',
@Subject varchar(4000)=''
as
set nocount on
declare @s varchar(8000),@s1 varchar(8000),@s2 varchar(8000)
select @s='',
@s1=''''+replace(@Nameunion,',',''',''')+'''',
@s2=''''+replace(@Subject,',',''',''')+''''
select @s=@s+',['+rtrim(Nameunion)+']=max(case Nameunion when '''
+rtrim(Nameunion)+''' then Score else '''' end)'
from Score
where @s1=''''''
or charindex(','''+Nameunion+''',',','+@s1+',')>0
group by Nameunion
if @s1>'''''' set @s1='Nameunion in('+@s1+')' else set @s1='1=1'
if @s2>'''''' set @s2='Subject in('+@s2+')' else set @s2='1=1'
exec('select Subject'+@s+'
from Score
where ('+@s1+') and ('+@s2+')
group by Subject')
go--调用
exec p_qry
exec p_qry '张三,李四'
exec p_qry '张三,李四','语文,数学'
exec p_qry '','语文,数学'
go--删除测试
drop table Score
drop proc p_qry/*--结果
Subject 李四 王二麻子 张三
---------- ---------- ---------- ----------
数学 85
物理 88
英语 78
语文 75 65Subject 李四 张三
---------- ---------- ----------
数学 85
物理 88
英语 78
语文 65Subject 李四 张三
---------- ---------- ----------
数学 85
语文 65Subject 李四 王二麻子 张三
---------- ---------- ---------- ----------
数学 85
语文 75 65
--*/
以前我在处理行列转换问题时,都是先把它们分解成一个一个的表,然后用Full Outer Join连接生成。