首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

行列转换100分解决方法

2012-02-03 
行列转换100分A表如下UserNameUserDateUserNum张三2009-11-110张三2009-11-22张三2009-11-37李四2009-11-5

行列转换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  

请教怎么做呢?具体点谢谢

[解决办法]

SQL code
通行列转换(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
[解决办法]
难点是每一天的竖着排我没想好方案
[解决办法]
收藏
------解决方案--------------------



[解决办法]

探讨
他们的都有统计功能,需要修改,很麻烦!我的只想显示出一个月的记录 1号到月底 每天对应的记录

[解决办法]
纯sql你介意弄出个临时表,而且需要用循环的插入数据么??有点土...就是在于每一天这里我的处理方案想不好...
[解决办法]
三楼回答 了

[解决办法]
占位学习
[解决办法]
sql server2005 早就支持行列转换的关键字了。 赶紧充充电吧。
[解决办法]
学习学习,研究研究
[解决办法]
SQL code
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

*/


[解决办法]
将就着用吧 在难我就不会了 呵呵
探讨
引用:
SQL codeifobject_id('a')isnotnulldroptable ACreatetable A(UserNamenvarchar(10), UserDateDateTime, UserNumint)goinsertinto Aselect'张三'      ,'2009-11-1',10unionallselect'张三'      ,'2009-11-2',2unionall?-
嗯 看看

[解决办法]
你看李四就是123都没有啊 

第二列式多余的 没用的
[解决办法]
SQL code
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语句就行了
[解决办法]

C# code
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
[解决办法]
老牛今天不用过节哈-___-
[解决办法]
过 这不还睡不着吗 
头像换了 你认识我?
[解决办法]
....睡觉去了
[解决办法]

[解决办法]
不错
[解决办法]
是不是真的啊
[解决办法]
不错。学习、
[解决办法]
学习学习,研究研究
[解决办法]
好难

热点排行