求一条SQL!!!!!!!!!!!!!!!!!!!
我现在有一维表如下
xh kc cj
051000333 高等数学 55
051000333 大学语文 67
051000333 经济学基础 88
021000224 高等数学 64
021000224 大学语文 32
021000224 经济学基础 75
041000851 高等数学 69
041000851 大学语文 75
041000851 经济学基础 65
要转换成下面的表
xh 高等数学 大学语文 经济学基础
051000333 55 67 88
021000224 64 32 75
041000851 69 75 65
请问一条SQL能搞定吗?
[解决办法]
create table t(xh varchar(20),kc varchar(20),cj int)
insert t select '051000333 ', '高等数学 ',55
union all select '051000333 ', '大学语文 ',67
union all select '051000333 ', '经济学基础 ',88
union all select '021000224 ', '高等数学 ',64
union all select '021000224 ', '大学语文 ',32
union all select '021000224 ', '经济学基础 ',75
union all select '041000851 ', '高等数学 ',69
union all select '041000851 ', '大学语文 ',75
union all select '041000851 ', '经济学基础 ',65
declare @sql varchar(8000)
set @sql = 'select xh '
select @sql = @sql + ' , sum(case kc when ' ' ' + kc + ' ' ' then cj else 0 end) [ ' + kc + '] '
from (select distinct kc from t) as a
set @sql = @sql + ' from t group by xh '
exec(@sql)
drop table t
xh 大学语文 高等数学 经济学基础
-------------------- ----------- ----------- -----------
021000224 32 64 75
041000851 75 69 65
051000333 67 55 88
[解决办法]
select xh,
sum(case when kc= '高等数学 ' then cj else 0 end) as '高等数学 ',
sum(case when kc= '大学语文 ' then cj else 0 end) as '大学语文 ',
sum(case when kc= '经济学基础 ' then cj else 0 end) as '经济学基础 '
from 表
group by xh
[解决办法]
select xh,高等数学=sum(case kc when '高等数学 ' then cj else 0 end),
大学语文=sum(case kc when '大学语文 ' then cj else 0 end),
经济学基础=sum(case kc when '经济学基础 ' then cj else 0 end)
from t group by xh
[解决办法]
CREATE TABLE #T(xh nvarchar(20),kc nvarchar(40),cj int)
INSERT INTO #T
SELECT '051000333 ', '高等数学 ', 55 UNION ALL
SELECT '051000333 ', '大学语文 ', 67 UNION ALL
SELECT '051000333 ', '经济学基础 ', 88 UNION ALL
SELECT '021000224 ', '高等数学 ', 64 UNION ALL
SELECT '021000224 ', '大学语文 ', 32 UNION ALL
SELECT '021000224 ', '经济学基础 ', 75 UNION ALL
SELECT '041000851 ', '高等数学 ', 69 UNION ALL
SELECT '041000851 ', '大学语文 ', 75 UNION ALL
SELECT '041000851 ', '经济学基础 ', 65
--方法1
SELECT xh
,MAX(CASE kc WHEN '高等数学 ' THEN cj ELSE 0 END) AS '高等数学 '
,MAX(CASE kc WHEN '大学语文 ' THEN cj ELSE 0 END) AS '大学语文 '
,MAX(CASE kc WHEN '经济学基础 ' THEN cj ELSE 0 END) AS '经济学基础 '
FROM #T
GROUP BY xh
--方法2
DECLARE @EXECUTE_SQL nvarchar(4000)
SET @EXECUTE_SQL= 'SELECT xh '
SELECT @EXECUTE_SQL=@EXECUTE_SQL+ ',MAX(CASE kc WHEN ' ' '+kc+ ' ' ' THEN cj ELSE 0 END) AS [ '+kc+ '] '
FROM #T
GROUP BY kc
SET @EXECUTE_SQL=@EXECUTE_SQL+ ' FROM #T GROUP BY xh '
EXECUTE(@EXECUTE_SQL)
DROP TABLE #T
/*
xh 高等数学 大学语文 经济学基础
051000333 55 67 88
021000224 64 32 75
041000851 69 75 65
*/
[解决办法]
来迟了 呵呵
[解决办法]
declare @sql varchar(8000)
set @sql = 'select xh '
select @sql = @sql + ' , sum(case kc when ' ' ' + kc + ' ' ' then cj else 0 end) [ ' + kc + '] '
from (select distinct kc from t) as a
set @sql = @sql + ' from t group by xh '
exec(@sql)
[解决办法]
select 学号,sum(case when 科目= '数学 ' then 成绩 else 0 end) '数学 ',sum(case when 科目= '语文 ' then 成绩 else 0 end ) '语文 ',sum(case when 科目= '经济 ' then 成绩 else 0 end ) '经济 '
from t group by 学号
这是个典型的行列转换
[解决办法]
SELECT xh
,max(
case kc WHEN '高等数学 ' THEN cj ELSE 0 END
) AS '高等数学 '
,MAX(
case kc WHEN '大学语文 ' THEN cj ELSE 0 END
) AS '大学语文 '
,MAX(
case kc WHEN '经济学基础 ' THEN cj ELSE 0 END
) AS '经济学基础 '
FROM 表
GROUP BY xh