sql普通行列转换
2023-06-13 09:14:09 时间
问题:假设有张学生成绩表(tb)如下:
姓名课程分数
张三语文74
张三数学83
张三物理93
李四语文74
李四数学84
李四物理94
想变成(得到如下结果):
姓名语文数学物理
----------------
李四748494
张三748393
-------------------
*/
createtabletb(姓名varchar(10),课程varchar(10),分数int)
insertintotbvalues("张三","语文",74)
insertintotbvalues("张三","数学",83)
insertintotbvalues("张三","物理",93)
insertintotbvalues("李四","语文",74)
insertintotbvalues("李四","数学",84)
insertintotbvalues("李四","物理",94)
go
--SQLSERVER2000静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select姓名as姓名,
max(case课程when"语文"then分数else0end)语文,
max(case课程when"数学"then分数else0end)数学,
max(case课程when"物理"then分数else0end)物理
fromtb
groupby姓名
--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare@sqlvarchar(8000)
set@sql="select姓名"
select@sql=@sql+",max(case课程when"""+课程+"""then分数else0end)["+课程+"]"
from(selectdistinct课程fromtb)asa
set@sql=@sql+"fromtbgroupby姓名"
exec(@sql)
--SQLSERVER2005静态SQL。
select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b
--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+"],[","")+课程fromtbgroupby课程
set@sql="["+@sql+"]"
exec("select*from(select*fromtb)apivot(max(分数)for课程in("+@sql+"))b")
---------------------------------
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名语文数学物理平均分总分
--------------------------
李四74849484.00252
张三74839383.33250
*/
--SQLSERVER2000静态SQL。
select姓名姓名,
max(case课程when"语文"then分数else0end)语文,
max(case课程when"数学"then分数else0end)数学,
max(case课程when"物理"then分数else0end)物理,
cast(avg(分数*1.0)asdecimal(18,2))平均分,
sum(分数)总分
fromtb
groupby姓名
--SQLSERVER2000动态SQL。
declare@sqlvarchar(8000)
set@sql="select姓名"
select@sql=@sql+",max(case课程when"""+课程+"""then分数else0end)["+课程+"]"
from(selectdistinct课程fromtb)asa
set@sql=@sql+",cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名"
exec(@sql)
--SQLSERVER2005静态SQL。
selectm.*,n.平均分,n.总分from
(select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b)m,
(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)n
wherem.姓名=n.姓名
--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+",","")+课程fromtbgroupby课程
exec("selectm.*,n.平均分,n.总分from
(select*from(select*fromtb)apivot(max(分数)for课程in("+@sql+"))b)m,
(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)n
wherem.姓名=n.姓名")
droptabletb
------------------
------------------
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名语文数学物理
张三74 83 93
李四74 84 94
想变成(得到如下结果):
姓名课程分数
------------
李四语文74
李四数学84
李四物理94
张三语文74
张三数学83
张三物理93
--------------
*/
createtabletb(姓名varchar(10),语文int,数学int,物理int)
insertintotbvalues("张三",74,83,93)
insertintotbvalues("李四",74,84,94)
go
--SQLSERVER2000静态SQL。
select*from
(
select姓名,课程="语文",分数=语文fromtb
unionall
select姓名,课程="数学",分数=数学fromtb
unionall
select姓名,课程="物理",分数=物理fromtb
)t
orderby姓名,case课程when"语文"then1when"数学"then2when"物理"then3end
--SQLSERVER2000动态SQL。
--调用系统表动态生态。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+"unionall","")+"select姓名,[课程]="+quotename(Name,"""")+",[分数]="+quotename(Name)+"fromtb"
fromsyscolumns
wherename!=N"姓名"andID=object_id("tb")--表名tb,不包含列名为姓名的其它列
orderbycolidasc
exec(@sql+"orderby姓名")
--SQLSERVER2005动态SQL。
select姓名,课程,分数fromtbunpivot(分数for课程in([语文],[数学],[物理]))t
--SQLSERVER2005动态SQL,同SQLSERVER2000动态SQL。
--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名课程分数
----------------
李四语文74.00
李四数学84.00
李四物理94.00
李四平均分84.00
李四总分252.00
张三语文74.00
张三数学83.00
张三物理93.00
张三平均分83.33
张三总分250.00
------------------
*/
select*from
(
select姓名as姓名,课程="语文",分数=语文fromtb
unionall
select姓名as姓名,课程="数学",分数=数学fromtb
unionall
select姓名as姓名,课程="物理",分数=物理fromtb
unionall
select姓名as姓名,课程="平均分",分数=cast((语文+数学+物理)*1.0/3asdecimal(18,2))fromtb
unionall
select姓名as姓名,课程="总分",分数=语文+数学+物理fromtb
)t
orderby姓名,case课程when"语文"then1when"数学"then2when"物理"then3when"平均分"then4when"总分"then5end
droptabletb
姓名课程分数
张三语文74
张三数学83
张三物理93
李四语文74
李四数学84
李四物理94
想变成(得到如下结果):
姓名语文数学物理
----------------
李四748494
张三748393
-------------------
*/
createtabletb(姓名varchar(10),课程varchar(10),分数int)
insertintotbvalues("张三","语文",74)
insertintotbvalues("张三","数学",83)
insertintotbvalues("张三","物理",93)
insertintotbvalues("李四","语文",74)
insertintotbvalues("李四","数学",84)
insertintotbvalues("李四","物理",94)
go
--SQLSERVER2000静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select姓名as姓名,
max(case课程when"语文"then分数else0end)语文,
max(case课程when"数学"then分数else0end)数学,
max(case课程when"物理"then分数else0end)物理
fromtb
groupby姓名
--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare@sqlvarchar(8000)
set@sql="select姓名"
select@sql=@sql+",max(case课程when"""+课程+"""then分数else0end)["+课程+"]"
from(selectdistinct课程fromtb)asa
set@sql=@sql+"fromtbgroupby姓名"
exec(@sql)
--SQLSERVER2005静态SQL。
select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b
--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+"],[","")+课程fromtbgroupby课程
set@sql="["+@sql+"]"
exec("select*from(select*fromtb)apivot(max(分数)for课程in("+@sql+"))b")
---------------------------------
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名语文数学物理平均分总分
--------------------------
李四74849484.00252
张三74839383.33250
*/
--SQLSERVER2000静态SQL。
select姓名姓名,
max(case课程when"语文"then分数else0end)语文,
max(case课程when"数学"then分数else0end)数学,
max(case课程when"物理"then分数else0end)物理,
cast(avg(分数*1.0)asdecimal(18,2))平均分,
sum(分数)总分
fromtb
groupby姓名
--SQLSERVER2000动态SQL。
declare@sqlvarchar(8000)
set@sql="select姓名"
select@sql=@sql+",max(case课程when"""+课程+"""then分数else0end)["+课程+"]"
from(selectdistinct课程fromtb)asa
set@sql=@sql+",cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名"
exec(@sql)
--SQLSERVER2005静态SQL。
selectm.*,n.平均分,n.总分from
(select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b)m,
(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)n
wherem.姓名=n.姓名
--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+",","")+课程fromtbgroupby课程
exec("selectm.*,n.平均分,n.总分from
(select*from(select*fromtb)apivot(max(分数)for课程in("+@sql+"))b)m,
(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)n
wherem.姓名=n.姓名")
droptabletb
------------------
------------------
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名语文数学物理
张三74 83 93
李四74 84 94
想变成(得到如下结果):
姓名课程分数
------------
李四语文74
李四数学84
李四物理94
张三语文74
张三数学83
张三物理93
--------------
*/
createtabletb(姓名varchar(10),语文int,数学int,物理int)
insertintotbvalues("张三",74,83,93)
insertintotbvalues("李四",74,84,94)
go
--SQLSERVER2000静态SQL。
select*from
(
select姓名,课程="语文",分数=语文fromtb
unionall
select姓名,课程="数学",分数=数学fromtb
unionall
select姓名,课程="物理",分数=物理fromtb
)t
orderby姓名,case课程when"语文"then1when"数学"then2when"物理"then3end
--SQLSERVER2000动态SQL。
--调用系统表动态生态。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+"unionall","")+"select姓名,[课程]="+quotename(Name,"""")+",[分数]="+quotename(Name)+"fromtb"
fromsyscolumns
wherename!=N"姓名"andID=object_id("tb")--表名tb,不包含列名为姓名的其它列
orderbycolidasc
exec(@sql+"orderby姓名")
--SQLSERVER2005动态SQL。
select姓名,课程,分数fromtbunpivot(分数for课程in([语文],[数学],[物理]))t
--SQLSERVER2005动态SQL,同SQLSERVER2000动态SQL。
--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名课程分数
----------------
李四语文74.00
李四数学84.00
李四物理94.00
李四平均分84.00
李四总分252.00
张三语文74.00
张三数学83.00
张三物理93.00
张三平均分83.33
张三总分250.00
------------------
*/
select*from
(
select姓名as姓名,课程="语文",分数=语文fromtb
unionall
select姓名as姓名,课程="数学",分数=数学fromtb
unionall
select姓名as姓名,课程="物理",分数=物理fromtb
unionall
select姓名as姓名,课程="平均分",分数=cast((语文+数学+物理)*1.0/3asdecimal(18,2))fromtb
unionall
select姓名as姓名,课程="总分",分数=语文+数学+物理fromtb
)t
orderby姓名,case课程when"语文"then1when"数学"then2when"物理"then3when"平均分"then4when"总分"then5end
droptabletb
相关文章
- txt文本格式怎么转换成excel_文本格式转换为日期
- jsx转换及React.createElement
- JS字符串转换为JSON的四种方法
- 【CSS】通过定位修改 display 显示模式 ( Display 显示模式转换 | inline-block 改块元素为行内块元素示例 | 为块元素设置浮动 | 为块元素设置定位 )
- 关于SQL的几道小题详解(sql进阶)
- 利用Oracle实现将时间转换成毫秒(oracle时间转换毫秒)
- 一键实现:SQL数据转换到Oracle的神器(sql转oracle工具)
- Java序列化对象-字符串转换详解编程语言
- Oracle解锁SQL:实现精准控制(oracle解锁sql)
- 转换MySQL 繁体到简体的转换实战(mysql繁体简体)
- Oracle SQL的数字取整方法简介(oracle取整sql)
- 脚本如何在Linux中执行SQL脚本(linux怎么执行sql)
- MySQL查看SQL日志:巧用技巧(mysql查看sql日志)
- MySQL实现分页查询的SQL语句(mysql的分页sql)
- Oracle转换日期之妙招(oracle转化日期)
- 如何防范SQL注入攻击:MySQL的几种安全策略(sql注入mysql)
- 媒体转换
- Oracle解析引擎:揭示SQL真谛(oracle解析sql)
- Linux连接SQL:简易入门指南(linux登录sql)
- 警惕MySQL中SQL语句的陷阱(mysql中sql语句坑)
- MySQL中使用SQL剪切实现数据处理(mysql中sql剪切)
- 用accdb转换mysql数据库的简单方法(accdb 转mysql)
- Oracle中时间数据的转换技巧(oracle中 时间转化)
- Oracle中SQL参数优化实践经验(oracle中sql参数)
- javabig5到gb2312的编码转换
- Sql学习第一天——SQL练习题(建表/sql语句)
- ASP转换格林威治时间函数DateDiff()应用