动态列的统计
有两个表,一个是表头定义 BT,如下
id mc
1 语文
2 数学
3 英语
4 体育
5 电脑
这个表是可以再动态的回多N个MC的
另一个表记录实际数据
mydate btid sj
2004-1-4 1 78
2004-1-4 2 85
2004-2-5 1 78
....... 3 74
....... 4 77
....... 1 55
..........................
我要的结果是怎么查询得出这种样子
日期 语文 数学 体育 ......(动态的,根据表bt的行数)
2004-1-4 (这一天的语文的和) (这一天的数学的和)
问题点数:50、回复次数:3Top
1 楼jinjazz(近身剪)回复于 2005-04-04 09:59:01 得分 50
--建立测试环境
Create Table 表1(id varchar(10),mc varchar(10))
--插入数据
insert into 表1
select '1','语文' union
select '2','数学' union
select '3','英语' union
select '4','体育' union
select '5','电脑'
--建立测试环境
Create Table 表2(mydate varchar(10),btid varchar(10),sj integer)
--插入数据
insert into 表2
select '2004-1-4','1','78' union
select '2004-1-4','2','85' union
select '2004-2-5','1','78' union
select '2004-2-5','3','74' union
select '2004-2-5','4','77' union
select '2004-2-5','1','55'
--测试语句
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT mydate'
SELECT @SQL= @SQL+
',sum(CASE WHEN btid = ''' + id + ''' THEN sj else 0 END) [' + mc + ']'
FROM (SELECT DISTINCT id,mc FROM 表1) a
SET @SQL=@SQL+' FROM 表2 GROUP BY mydate'
exec (@SQL)
--删除测试环境
Drop Table 表2
Drop Table 表1
/*
mydate 语文 数学 英语 体育 电脑
---------- ----------- ----------- ----------- ----------- -----------
2004-1-4 78 85 0 0 0
2004-2-5 133 0 74 77 0
*/
Top
2 楼cwq99(陈文)回复于 2005-04-04 10:11:41 得分 0
谢谢!!!Top
3 楼winternet(冬天)回复于 2005-04-04 10:19:58 得分 0
declare @s nvarchar(4000)
select @s=''
select @s=@s+','+'sum(case a.mc when '''+a.mc+''' then b.sj else 0 end)[' +a.mc+']'
from 表1 as a
select @s='select b.mydate'+@s+' from 表1 as a inner join 表2 as b on a.id=b.btid
group by b.mydate'
exec (@s)
结果:
mydate 語文 數學 英語 體育 電腦
---------- ----------- ----------- ----------- ----------- -----------
2004-1-4 78 85 0 0 0
2004-2-5 133 0 74 77 0Top




