首页 > 数据库 >sql service行转列

sql service行转列

时间:2023-08-14 17:47:27浏览次数:54  
标签:studentname service grade column 转列 StuInfo sql select subject

PIVOT的一般语法:
SELECT [新表字段1,2,3…] FROM [原表名]
AS [原表别名]
PIVOT( [聚合函数] ( [原表字段1] ) FOR [原表字段2] IN ( [原表2值1],[原表字段2值2]… ) ) AS [新表别名]

语法解释:
1、PIVOT必须列举[原表字段2的值],列举的值必须用中括号 [ ] 包含起来,就算是字符串类型也不需要单引号 ’ ’
2、PIVOT中列举的值将作为新表的字段名称
3、为什么会有聚合函数?此处并没有GROUP BY 呀!偷偷告诉你,GROUP BY 是隐藏的,除了语句中出现的两个 [原表字段],其他[原表字段]将被GROUP BY,这样才使得上面的PIVOT结果出现多行
4、列举字段的这个组在原表中没有数据将以NULL值存在于PIVOT后的新表
5、PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为pivot后的新表

CREATE TABLE [dbo].[StuInfo](
	[studentname] [varchar](30) NULL,
	[subject] [varchar](10) NULL,
	[grade] [int] NULL
) ON [PRIMARY]
//插入数据
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('刘备', '语文', 80);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('刘备', '数学', 82);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('刘备', '英语', 84);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('赵云', '语文', 70);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('赵云', '数学', 74);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('赵云', '英语', 76);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('关羽', '语文', 90);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('关羽', '数学', 93);
INSERT INTO [dbo].[StuInfo]([studentname], [subject], [grade]) VALUES ('关羽', '英语', 94);
select * from  StuInfo

需求:按学生名称查询各科成绩:

静态case when 实现

select studentname,
	sum(case when subject='语文' then grade else NULL end) as 语文,
	sum(case when subject='数学' then grade else NULL end) as 数学,
	sum(case when subject='英语' then grade else NULL end) as 英语
from stuinfo
group by studentname

静态pivot

select * from  stuinfo pivot(sum(grade) for subject in ([语文],[数学],[英语]) ) as P 

如果每位同学都增加了物理成绩,静态语句需要做调整,这个时候可以用动态查询。

insert into StuInfo values('关羽','物理',100);
insert into StuInfo values('刘备','物理',90);
insert into StuInfo values('赵云','物理',80);

–动态case when

declare @SQL nvarchar(max)
declare @column nvarchar(max)

set @column=N'';

with sub as
(
select distinct subject  from stuinfo
)
select @column+=N'sum(case when subject='''+ subject + N''' then grade else null end )as '+ subject + N','
from sub 
select @column=SUBSTRING(@column,1,len(@column)-1)
select @SQL=N'select studentname,'+@column+N' from stuinfo
group by stuinfo.studentname'
print(@sql)
exec(@SQL)

动态pivot

declare @sql nvarchar(max)
declare @column nvarchar(max)

set @column=N'';

with sub AS
(
select distinct subject
from stuinfo
)

select @column+=N'[' + cast(subject as varchar(30)) + N'],'
from sub  

select @column=SUBSTRING(@column,1,len(@column)-1)
select @sql=N'select pivot_stuinfo.studentname, ' + @column + 
N' from stuinfo pivot(sum(grade) for subject in (' + @column + N')) as pivot_stuinfo'

print(@sql)
exec (@sql)

 

标签:studentname,service,grade,column,转列,StuInfo,sql,select,subject
From: https://www.cnblogs.com/flydmxy/p/17629295.html

相关文章

  • MySQL数据库不可不学的一个数据库福利来了
    Spring常用注解redis视频集合,看完这些别说不会redis代码资料.zip代码资料解压密码:wosn.net第1章数据库简介-8-1[wosn.net].mp4第3章SQL语句规范-8-3[wosn.net].mp4第2章数据库的安装及配置-8-2.mp4第4章数据库的相关操作-8-4.mp4第10章测试字符串类型-8-10[wosn.net].mp4第11......
  • 在postgresql数据库中如何实现Oracle中dblink功能
    转:https://blog.csdn.net/weixin_73350116/article/details/131905912引言在Oracle中常常有dblink功能,可以通过dblinks实现不同地址下得oracle数据库得数据交互。dblink是Oracle独有得功能,其他数据库有吗?当然,在postgresql也可以通过fdw实现与其他数据库进行数据交互,并且相较于O......
  • mysql 加索引
    1.PRIMARY  KEY(主键索引)    mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY(  `column`  ) 2.UNIQUE(唯一索引)      mysql>ALTER  TABLE  `table_name`  ADD  UNIQUE(`column`) 3.INDEX(普通索引)    mysql>ALTER ......
  • 一文玩转MQTT (ESP8266 DHT11 MQTT MYSQL方案)
    本文我们来聊一聊esp8266利用mqtt协议进行通信。并将数据数据存入数据库的操作。关于MQTTMQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。搭建MQTT服务器......
  • mysql 5.0升级到8.0
    1.替换新的驱动jar包       <dependency>           <groupId>com.mysql</groupId>           <artifactId>mysql-connector-j</artifactId>           <version>8.0.31</version>       </dependency>        ......
  • mysql怎么查询数据库容量(转)
    注:本文来源<mysql怎么查询数据库容量>  作者:文/@UTHEME2023-05-1107:00:02在数据库管理的过程中,经常需要查询数据库或表的容量大小,以方便更好地管理和优化数据库。MySQL作为一种流行的数据库管理系统,非常适合用于此任务。那么,如何在MySQL中查询数据库容量呢?首先,我们需要打......
  • 《java面试宝典》之SQL常见面试题
    一、SQL分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)二、基本语法1、创建数据库createdatabasedatabase-name2、删除数据库dropdatabasedbname3、创建新表createtabletabname......
  • SQL Server安装
    全选命名实例,也可默认点击下一步配置如下设置密码root......
  • CentOS7安装MySQL:使用Yum存储库方式
    一、安装环境安装环境如下:服务器:CentOS7.9安装版本:MySQL5.7(最新版)二、安装过程和细节1、在官网下载MySQLYum源安装文件用MySQLYum存储库安装的方式,其实就是通过Linux系统的Yum源安装的方式,主要的Yum源配置文件存放在/etc/yum.repos.d目录下,所以要想通过这种方式安......
  • Mysql - BIGINT 数据类型
    1、bigint默认是有符号,即取值范围是正负范围比如:bigint(20),就是-1234567890123456789~+12345678901234567892、bigintunsigned无符号,即取值范围就是正值范围比如:bigint(20),就是+12345678901234567890BIGINTUNSIGNED是MySQL中一种无符号的整数数据类型,使用8个字节(64位)......