请教一个SQL问题?(在线等...)
本人在数据库中有一个表,其数据如下:
用户 问题名 得分
------------------------------------------------------
用户1 问题1 1
用户1 问题2 3
用户1 问题3 2
用户1 问题4 1
用户1 问题5 4
用户2 问题1 1
用户2 问题2 4
用户2 问题3 2
用户2 问题4 5
用户2 问题5 4
用户3 问题1 1
用户3 问题2 3
用户3 问题3 2
用户3 问题4 5
用户3 问题5 1
请教怎么得到下面的Table:
用户 问题1 问题2 问题3 问题4 问题5
--------------------------------------
用户1 1 3 2 1 4
用户2 1 4 2 5 4
用户3 1 3 2 5 1
[解决办法]
name object score
a EN 89
a CH 78
a HO 99
b EN 34
b CH 88
b HO 66
要求生成下面样式
name EN CH HO
a 89 78 99
b 34 88 66
CREATE TABLE t(name VARCHAR(10), object VARCHAR(10), score INT)
INSERT t SELECT 'a ', 'EN ' , 89
UNION ALL SELECT 'a ', 'CH ' , 78
UNION ALL SELECT 'a ' , 'HO ' , 99
UNION ALL SELECT 'b ' , 'EN ' , 34
UNION ALL SELECT 'b ' , 'CH ' , 88
UNION ALL SELECT 'b ' , 'HO ' , 66
--object出现的不同值的个数是有限的那么使用
SELECT name,
EN=MAX(CASE WHEN object= 'EN ' THEN score ELSE 0 END),
CH=MAX(CASE WHEN object= 'CH ' THEN score ELSE 0 END),
HO=MAX(CASE WHEN object= 'HO ' THEN score ELSE 0 END)
FROM t
GROUP BY name
--若object出现的不同值是不定的
DECLARE @sql VARCHAR(8000)
SET @sql= 'SELECT name '
SELECT @sql=@sql+ ',[ '+object+ ']=MAX(CASE object WHEN ' ' '+object+ ' ' ' THEN score ELSE 0 END) ' FROM t GROUP BY object
EXEC(@sql+ ' FROM t GROUP BY name ')
DROP TABLE t
供参考。
[解决办法]
lxmfll2000(lxm) 正解
DECLARE @sql VARCHAR(8000)
SET @sql= 'SELECT 用户 '
SELECT @sql=@sql+ ',[ '+问题名+ ']=MAX(CASE 问题名 WHEN ' ' '+问题名+ ' ' ' THEN 得分 ELSE 0 END) ' FROM t GROUP BY 问题名
EXEC(@sql+ ' FROM t GROUP BY 用户 ')
你的表名叫t的话
[解决办法]
很久以前做过类似的问题,刚才想不起来了,重新找的,呵呵,没想到回来时候,楼上已经解答完了
同上
select 用户,问题名,sum(得分) as 得分 into #temp from TestTable group by 用户,问题名
declare @str1 varchar(8000)
set @str1= 'select 用户, '
select @str1=@str1+ 'isnull(sum(case 问题名 when '+char(39)+问题名+char(39)+ ' then 得分 end),0) as '+问题名+ ', '
from
(
select distinct 问题名 from #temp
) as temp order by 问题名
select @str1=left(@str1,len(@str1)-1)+ ' from #temp group by 用户 '
exec (@str1)
drop table #temp