假设有张学生成绩表(CJ)如下
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82想变成
姓名 语文 数学 物理
张三 80 90 85
李四 85 92 82----------将下列代码改成在查询器里执行的sql语句------------
declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when ' ' '+Subject+' ' ' then Result end) ['+Subject+']'
from (select distinct Subject from CJ) as a
select @sql = @sql+' from CJ group by name'
exec(@sql)
谢谢!
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82想变成
姓名 语文 数学 物理
张三 80 90 85
李四 85 92 82----------将下列代码改成在查询器里执行的sql语句------------
declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when ' ' '+Subject+' ' ' then Result end) ['+Subject+']'
from (select distinct Subject from CJ) as a
select @sql = @sql+' from CJ group by name'
exec(@sql)
谢谢!
改成
set @sql
select @sql
改成
set @sql
---------------------改了没用,麻烦哪位建个表,测一下好不好?
谁搞定给一半分给他!
select Name,
sum(case subject when '语文' then result end) as '语文',
sum(case subject when '数学' then result end) as '数学',
sum(case subject when '物理' then result end) as '物理'
from CJ
group by name
insert into t select '张三' , '语文' , 80 union all
select '张三' , '数学' , 90 union all
select '张三' , '物理' , 85 union all
select '李四' , '语文' , 85 union all
select '李四' , '数学' , 92 union all
select '李四' , '物理' , 82DECLARE @sql VARCHAR(8000)
SET @sql='SELECT name'
SELECT @sql=@sql+',['+Subject+']=MAX(CASE Subject WHEN '''+Subject+''' THEN Result ELSE 0 END)' FROM t GROUP BY Subject
EXEC(@sql+' FROM t GROUP BY name')
drop table t
-------------------------------
name 数学 物理 语文
李四 92 82 85
张三 90 85 80
----------------
你的确实是可行的,但是如果把Result改成字符串类型怎么办呢?
还有你的max适用不了result为空的数据,
insert into t select '张三' , '语文' , 80 union all
select '张三' , '数学' , 90 union all
select '张三' , '物理' , 85 union all
select '李四' , '语文' , 85 union all
select '李四' , '数学' , 92
insert into t([name],subject) values('李四' , '物理')
DECLARE @sql VARCHAR(8000)
SET @sql='SELECT name'
SELECT @sql=@sql+',['+Subject+']=MAX(CASE Subject WHEN '''+Subject+''' THEN Result ELSE 0 END)' FROM t GROUP BY Subject
EXEC(@sql+' FROM t GROUP BY name')
drop table t
name 数学 物理 语文
李四 92 0 85
张三 90 85 80
怎么不行,完全可以.
name 数学 物理 语文
李四 92 0 85
张三 90 85 80
---------------
对,就是这样!
只是,如果我加了一条记录:
张三,化学,88,
这样的话,好像“化学”查不出来。
能不能帮忙优化一下?我看不懂那段sql
insert into t([name],subject,Result) values('张三','化学','88')
-------------------------------------
name 化学 数学 物理 语文
李四 0 92 0 85
张三 88 90 85 80
李四 92 0 85
张三 90 85 80
可以啊.
insert into t([name],subject,Result) values('张三','化学','88')
-------------------------------------
name 化学 数学 物理 语文
李四 0 92 0 85
张三 88 90 85 80
---------------
是我把记录看错了,你的是正确的,谢谢!
SELECT @sql=@sql+',['+Subject+']=MAX(CASE Subject WHEN '''+Subject+''' THEN Result ELSE 0 END)' FROM t GROUP BY Subject这三行代码吗?
SELECT name,[化学]=MAX(CASE Subject WHEN '化学' THEN Result ELSE 0 END),[数学]=MAX(CASE Subject WHEN '数学' THEN Result ELSE 0 END),[物理]=MAX(CASE Subject WHEN '物理' THEN Result ELSE 0 END),[语文]=MAX(CASE Subject WHEN '语文' THEN Result ELSE 0 END)
你把字符串打出来就清楚了.
SELECT name,[化学]=MAX(CASE Subject WHEN '化学' THEN Result ELSE 0 END),[数学]=MAX(CASE Subject WHEN '数学' THEN Result ELSE 0 END),[物理]=MAX(CASE Subject WHEN '物理' THEN Result ELSE 0 END),[语文]=MAX(CASE Subject WHEN '语文' THEN Result ELSE 0 END)
-------------还是不适合我的需求,等会开个100分的贴子给你!如果我把Result成绩字段改成 "字符串"就不行了,
而我的需求是:result字段的内容不光是数字,也可能有字符串!
谁搞定给一半分给他!
-----------------------------
LZ真小气,一半才十分,呵呵.
---------------不会啦,会开贴给你100的。这样吧,可能我的问题简单地用该sql是搞不定的,我上传一张图片,你看一下就明白了。见图:
http://images13.51.com/13/a/76/6d/mgao0118/638_627_cbc34d183230332b.jpg另外,还有三个过滤条件:Show all properties
Show only shared properties
Show only difference我想你会明白的。
zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变?) ( ) 信誉:100 Blog 加为好友
------------
我另外个贴子,给你100分,表示感谢!