首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一条SQL!该如何解决

2012-01-23 
求一条SQL!!!!!!!!!!!!!!!!!!!我现在有一维表如下xhkccj051000333高等数学55051000333大学语文67051000333

求一条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

热点排行