一个sql的演变过程--将字段值显示为字段

-----------------------题目----------------------
Name Subject Score
张三 语文 11 
张三 数学 22 
张三 历史 33 
李四 语文 11 
李四 数学 22 
李四 历史 33 

想变成 
姓名 语文 数学 历史 
张三  11   22   33 
李四  11   22   33 

-------------------------------------------------

解决步骤
1 建表给数据

ContractedBlock.gif ExpandedBlockStart.gif Code
CREATE TABLE TEST2
(
   Name 
varchar(36),
   Subject 
varchar(36),
   Score 
int
)

insert into TEST2 values ('张三','语文',11)
insert into TEST2 values ('张三','数学',22)
insert into TEST2 values ('张三','历史',33)

insert into TEST2 values ('李四','语文',11)
insert into TEST2 values ('李四','数学',22)
insert into TEST2 values ('李四','历史',33)

SELECT * 

 

2  第一感觉

SELECT  Name,
' 历史 ' = ( CASE  Subject  when   ' 历史 '   THEN  Score  end ),
' 数学 ' = ( case  Subject  when   ' 数学 '   then  Score  end ),
' 语文 ' = ( case  Subject  when   ' 语文 '   then  Score  end
 
FROM  TEST2

-- 判断其字段值,并将其转换为字段名称

 

显示效果如图:


观察结果,只需要再按照Name来进行group,并sum(科目)就可以得到如题的结果,因此转换为如下:

SELECT  Name,
' 历史 ' = SUM ( CASE  Subject  when   ' 历史 '   THEN  Score  end ),
' 数学 ' = SUM ( case  Subject  when   ' 数学 '   then  Score  end ),
' 语文 ' = SUM ( case  Subject  when   ' 语文 '   then  Score  end
 
FROM  TEST2
 
GROUP   BY  Name

 

结果如图:

3 改善sql语句

 终上所述的方法,不太理想需要进行一定的修改让其通用。
 如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
DECLARE @SQLStr VARCHAR(2000)
  
SET @SQLStr='SELECT Name'
  
SELECT @SQLStr=@SQLStr+''''+Subject+'''= SUM(CASE Subject WHEN '''+Subject+''' THEN Score END)' FROM (SELECT DISTINCT Subject FROM TEST2) AS Test
--(SELECT DISTINCT Subject FROM TEST2) AS Test 此处AS Test 不能少,不然不识别查询来自于那个表
--
在sql中单引号的转义需要两个单引号,如'''+Subject+'''翻译之后为 '+Subject+'
  SELECT @SQLStr=@SQLStr+' FROM TEST2 GROUP BY Name'
--对结果集进行分组统计
  EXEC (@SQLStr

 

ContractedBlock.gifCodeContractedBlock.gifCode

4 打完收工~~~~ 


 

转载于:https://www.cnblogs.com/tzy080112/archive/2009/05/06/1450703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值