SQL 行与列互转

--- 行与列互转

use boris
if OBJECT_ID('tb_ChengJi') is not null
drop table tb_ChengJi
create table tb_ChengJi(Name varchar(10) , Course varchar(10) , Score float) 
insert into tb_ChengJi values('张三' , '语文' , 74) 
insert into tb_ChengJi values('张三' , '数学' , 83) 
insert into tb_ChengJi values('张三' , '物理' , 93) 
insert into tb_ChengJi values('李四' , '语文' , 74) 
insert into tb_ChengJi values('李四' , '数学' , 84)
select * from tb_ChengJi
/*
Name       Course     Score
---------- ---------- -----------
张三         语文         74
张三         数学         83
张三         物理         93
李四         语文         74
李四         数学         84
*/
--简单转换
/*
select distinct Name AS 姓名,
(SELECT Score FROM tb_ChengJi tb_1 WHERE Course='物理' AND tb_1.Name=tb.Name ) AS 物理 ,
(SELECT Score FROM tb_ChengJi tb_1 WHERE Course='数学' AND tb_1.Name=tb.Name ) AS 数学 ,
(SELECT Score FROM tb_ChengJi tb_1 WHERE Course='语文' AND tb_1.Name=tb.Name ) AS 语文 
from tb_ChengJi tb
*/
---PIVOT用于将列值旋转为列名(即行转列) 
select * from tb_ChengJi  pivot (max(Score) for Course in (物理,数学,语文)) AS A
/*
姓名         物理          数学          语文
---------- ----------- ----------- -----------
李四         NULL        84          74
张三         93          83          74
*/
--UNPIVOT列转行
/*
DROP TABLE #TT 
select * INTO #TT FROM 
(select * from tb_ChengJi  pivot (max(Score) for Course in (物理,数学,语文)) AS A) AS T
SELECT * FROM #TT

SELECT Name,Course,Score FROM #TT UNPIVOT (Score for Course in (物理,数学,语文)) AS QQ
*/
--含各人平均分及总分
select Name AS 姓名,
(SELECT Score FROM tb_ChengJi tb_1 WHERE Course='物理' AND tb_1.Name=tb.Name ) AS 物理 ,
(SELECT Score FROM tb_ChengJi tb_1 WHERE Course='数学' AND tb_1.Name=tb.Name ) AS 数学 ,
(SELECT Score FROM tb_ChengJi tb_1 WHERE Course='语文' AND tb_1.Name=tb.Name ) AS 语文 ,
CAST(CAST(AVG(Score) AS DECIMAL(18,2)) as float) AS 平均分,
--- CONVERT(DECIMAL(18,2),AVG(Score)) AS 平均分,
SUM(Score) AS 总分
from tb_ChengJi tb GROUP BY Name
/*
姓名         物理          数学          语文          平均分         总分
---------- ----------- ----------- ----------- ----------- -----------
李四         NULL        84          74          79.00          158
张三         93          83          74          83.00          250
*/
--加各科平均分
SELECT B.*,C.平均分,C.总分 FROM 
(select * from tb_ChengJi pivot(MAX(Score) for Course in(语文,数学,物理)) AS A) as B,
(SELECT Name,CAST(CAST(AVG(Score) AS DECIMAL(18,2)) as float) AS 平均分,CAST(CAST(sum(Score) AS DECIMAL(18,2)) as float) AS 总分  FROM tb_ChengJi GROUP BY Name) AS C
WHERE B.Name=C.Name
UNION all
SELECT DISTINCT '平均值' AS total,
(select CAST(CAST(AVG(Score) AS DECIMAL(18,2)) as float)from tb_ChengJi where Course='语文') AS 语文平均成绩,
(select CAST(CAST(AVG(Score) AS DECIMAL(18,2)) as float)from tb_ChengJi where Course='数学') AS 数学平均成绩,
(select CAST(CAST(AVG(Score) AS DECIMAL(18,2)) as float)from tb_ChengJi where Course='物理') AS 物理平均成绩,
CAST(CAST(AVG(Score) AS DECIMAL(18,2)) as float) AS 平均分,
null
 from tb_ChengJi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值