行列转换100分
A表如下
UserName UserDate UserNum
张三 2009-11-1 10
张三 2009-11-2 2
张三 2009-11-3 7
李四 2009-11-5 6
李四 2009-11-11 8
王五 2009-11-1 8
王五 2009-11-24 10
。。。
-----------------------------------------------
想实现的效果是
张三 李四 王五
1 10 - 8
2 2 - -
3 7 - -
.
.
.
30
请教怎么做呢?具体点谢谢
[解决办法]
通行列转换(version 2.0)作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)时间:-03-09地点:广东深圳说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:姓名课程分数张三语文74张三数学83张三物理93李四语文74李四数学84李四物理94想变成(得到如下结果):姓名语文数学物理---- ---- ---- ----李四74 84 94张三74 83 93-------------------*/create table tb(姓名varchar(10) , 课程varchar(10) , 分数int)insert into tb values('张三' , '语文' , 74)insert into tb values('张三' , '数学' , 83)insert into tb values('张三' , '物理' , 93)insert into tb values('李四' , '语文' , 74)insert into tb values('李四' , '数学' , 84)insert into tb values('李四' , '物理' , 94)go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)select 姓名as 姓名, max(case 课程when '语文' then 分数else 0 end) 语文, max(case 课程when '数学' then 分数else 0 end) 数学, max(case 课程when '物理' then 分数else 0 end) 物理from tbgroup by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare @sql varchar(8000)set @sql = 'select 姓名'select @sql = @sql + ' , max(case 课程when ''' + 课程+ ''' then 分数else 0 end) [' + 课程+ ']'from (select distinct 课程from tb) as aset @sql = @sql + ' from tb group by 姓名'exec(@sql) --SQL SERVER 2005 静态SQL。select * from (select * from tb) a pivot (max(分数) for 课程in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。declare @sql varchar(8000)select @sql = isnull(@sql + '],[' , '') + 课程from tb group by 课程set @sql = '[' + @sql + ']'exec ('select * from (select * from tb) a pivot (max(分数) for 课程in (' + @sql + ')) b')---------------------------------/*问题:在上述结果的基础上加平均分,总分,得到如下结果:姓名语文数学物理平均分总分---- ---- ---- ---- ------ ----李四74 84 94 84.00 252张三74 83 93 83.33 250*/--SQL SERVER 2000 静态SQL。select 姓名姓名, max(case 课程when '语文' then 分数else 0 end) 语文, max(case 课程when '数学' then 分数else 0 end) 数学, max(case 课程when '物理' then 分数else 0 end) 物理, cast(avg(分数*1.0) as decimal(18,2)) 平均分, sum(分数) 总分from tbgroup by 姓名--SQL SERVER 2000 动态SQL。declare @sql varchar(8000)set @sql = 'select 姓名'select @sql = @sql + ' , max(case 课程when ''' + 课程+ ''' then 分数else 0 end) [' + 课程+ ']'from (select distinct 课程from tb) as aset @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分, sum(分数) 总分from tb group by 姓名'exec(@sql) --SQL SERVER 2005 静态SQL。select m.* , n.平均分, n.总分from(select * from (select * from tb) a pivot (max(分数) for 课程in (语文,数学,物理)) b) m,(select 姓名, cast(avg(分数*1.0) as decimal(18,2)) 平均分, sum(分数) 总分from tb group by 姓名) nwhere m.姓名= n.姓名--SQL SERVER 2005 动态SQL。declare @sql varchar(8000)select @sql = isnull(@sql + ',' , '') + 课程from tb group by 课程exec ('select m.* , n.平均分, n.总分from(select * from (select * from tb) a pivot (max(分数) for 课程in (' + @sql + ')) b) m , (select 姓名, cast(avg(分数*1.0) as decimal(18,2)) 平均分, sum(分数) 总分from tb group by 姓名) nwhere m.姓名= n.姓名')drop table tb
[解决办法]
http://topic.csdn.net/u/20090912/14/25d2e1b2-f352-4713-8618-d3433ba27bef.html
http://topic.csdn.net/u/20080512/14/6022944a-0b8b-4239-9f2b-9d2a2492d93d.html
[解决办法]
难点是每一天的竖着排我没想好方案
[解决办法]
收藏
------解决方案--------------------
[解决办法]
if object_id('a') is not null
drop table A
Create table A(UserName nvarchar(10), UserDate DateTime, UserNum int)
go
insert into A select
'张三' ,'2009-11-1', 10 union all select
'张三' ,'2009-11-2', 2 union all select
'张三' ,'2009-11-3', 7 union all select
'李四' ,'2009-11-5', 6 union all select
'李四' ,'2009-11-11', 8 union all select
'王五' ,'2009-11-1', 8 union all select
'王五' ,'2009-11-24', 10
declare @str nvarchar(1000)
select @str='Select datepart(dd,UserDate) as [day]'
select @str=@str+','+quotename(UserName)+'=max(case UserName When '''+UserName+''' then UserNum else 0 end)'
from (Select distinct UserName from A) T
select @str=@str+ ' from A Group By datepart(dd,UserDate)'
select @str='
select p.number,v.*
from
(
select number from
master..spt_values where type=''p'' and number between 1 and 31
) p left join
(' + @str + ') v on p.number=[day]'
--print @str
exec(@str)
/*
number day 李四 王五 张三
----------- ----------- ----------- ----------- -----------
1 1 0 8 10
2 2 0 0 2
3 3 0 0 7
4 NULL NULL NULL NULL
5 5 6 0 0
6 NULL NULL NULL NULL
7 NULL NULL NULL NULL
8 NULL NULL NULL NULL
9 NULL NULL NULL NULL
10 NULL NULL NULL NULL
11 11 8 0 0
12 NULL NULL NULL NULL
13 NULL NULL NULL NULL
14 NULL NULL NULL NULL
15 NULL NULL NULL NULL
16 NULL NULL NULL NULL
17 NULL NULL NULL NULL
18 NULL NULL NULL NULL
19 NULL NULL NULL NULL
20 NULL NULL NULL NULL
21 NULL NULL NULL NULL
22 NULL NULL NULL NULL
23 NULL NULL NULL NULL
24 24 0 10 0
25 NULL NULL NULL NULL
26 NULL NULL NULL NULL
27 NULL NULL NULL NULL
28 NULL NULL NULL NULL
29 NULL NULL NULL NULL
30 NULL NULL NULL NULL
31 NULL NULL NULL NULL
*/
if object_id('a') is not null drop table ACreate table A(UserName nvarchar(10), UserDate DateTime, UserNum int)goinsert into A select'张三' ,'2009-11-1', 10 union all select'张三' ,'2009-11-2', 2 union all select'张三' ,'2009-11-3', 7 union all select'李四' ,'2009-11-5', 6 union all select'李四' ,'2009-11-11', 8 union all select'王五' ,'2009-11-1', 8 union all select'王五' ,'2009-11-24', 10 declare @str nvarchar(1000) select @str='Select datepart(dd,UserDate) as [day]'select @str=@str+','+quotename(UserName)+'=max(case UserName When '''+UserName+''' then UserNum else null end)'from (Select distinct UserName from A) Tselect @str=@str+ ' from A Group By datepart(dd,UserDate)'select @str='select p.number,v.*from(select number from master..spt_values where type=''p'' and number between 1 and 31) p left join (' + @str + ') v on p.number=[day]'--print @strexec(@str)/*number day 李四 王五 张三 ----------- ----------- ----------- ----------- ----------- 1 1 NULL 8 102 2 NULL NULL 23 3 NULL NULL 74 NULL NULL NULL NULL5 5 6 NULL NULL6 NULL NULL NULL NULL7 NULL NULL NULL NULL8 NULL NULL NULL NULL9 NULL NULL NULL NULL10 NULL NULL NULL NULL11 11 8 NULL NULL12 NULL NULL NULL NULL13 NULL NULL NULL NULL14 NULL NULL NULL NULL15 NULL NULL NULL NULL16 NULL NULL NULL NULL17 NULL NULL NULL NULL18 NULL NULL NULL NULL19 NULL NULL NULL NULL20 NULL NULL NULL NULL21 NULL NULL NULL NULL22 NULL NULL NULL NULL23 NULL NULL NULL NULL24 24 NULL 10 NULL25 NULL NULL NULL NULL26 NULL NULL NULL NULL27 NULL NULL NULL NULL28 NULL NULL NULL NULL29 NULL NULL NULL NULL30 NULL NULL NULL NULL31 NULL NULL NULL NULL*/
[解决办法]
把下面查询的这一堆全都放到sql语句就行了
[解决办法]
if object_id('a') is not null drop table ACreate table A(UserName nvarchar(10), UserDate DateTime, UserNum int)goinsert into A select'张三' ,'2009-11-1', 10 union all select'张三' ,'2009-11-2', 2 union all select'张三' ,'2009-11-3', 7 union all select'李四' ,'2009-11-5', 6 union all select'李四' ,'2009-11-11', 8 union all select'王五' ,'2009-11-1', 8 union all select'王五' ,'2009-11-24', 10 --------写成存储过程了 create procedure p asbegin declare @str nvarchar(1000) select @str='Select datepart(dd,UserDate) as [day]' select @str=@str+','+quotename(UserName)+'=max(case UserName When '''+UserName+''' then UserNum else null end)' from (Select distinct UserName from A) T select @str=@str+ ' from A Group By datepart(dd,UserDate)' select @str=' select p.number,v.* from ( select number from master..spt_values where type=''p'' and number between 1 and 31 ) p left join (' + @str + ') v on p.number=[day]' --print @strexec(@str)end--调用存储过程你会吧exec p
[解决办法]
老牛今天不用过节哈-___-
[解决办法]
过 这不还睡不着吗
头像换了 你认识我?
[解决办法]
....睡觉去了
[解决办法]
[解决办法]
不错
[解决办法]
是不是真的啊
[解决办法]
不错。学习、
[解决办法]
学习学习,研究研究
[解决办法]
好难