SQL小知识010:COALESCE与CASE的组合,实现一个表记录值作为第二个表字段

张三参加三门课,李四参加四门课,成绩如下

sname    subject    score
張三    語文    80
張三    數學    90
張三    物理    85
李四    語文    85
李四    數學    92
李四    物理    82
李四    化學    82

问题:将上表一的数据变成表二格式,如下

sname    语文    数学    物理    化学
李四        85       92         82       82
張三        80       90         85       0

SQL代码如下:

 if not object_id(N'Tempdb..#T1') is null 
 drop table #T1
 --测试数据建立
 CREATE TABLE #T1 (sname nvarchar(10),[subject] nvarchar(10),score int)
 INSERT INTO #T1 VALUES ('張三','語文',80)
 INSERT INTO #T1 values ('張三','數學',90)
 INSERT INTO #T1 VALUES ('張三','物理',85)
 INSERT INTO #T1 VALUES ('李四','語文',85)
 INSERT INTO #T1 values ('李四','數學',92)
 INSERT INTO #T1 VALUES ('李四','物理',82)
 INSERT INTO #T1 VALUES ('李四','化學',82)
 select * from  #T1
 
--使用 COALESCE  + CASE
SELECT sname,
COALESCE(SUM(CASE [subject] WHEN '語文' THEN score END),0) 语文,
COALESCE(SUM(CASE [subject] WHEN '數學' THEN score END),0) 数学,
COALESCE(SUM(CASE [subject] WHEN '物理' THEN score END),0) 物理,
COALESCE(SUM(CASE subject WHEN '化學' THEN score END),0) 化学
FROM #T1
GROUP BY sname 

小结 :表一的记录的值作为表二的字段,则需要使用到 CASE语句,而表一中张三是没有化学成绩的,

所以需要使用 COALESCE

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值