首页 > 数据库 >SQLSERVER 使用PIVOT、UNPIVOT实现行转列与列转行!!!

SQLSERVER 使用PIVOT、UNPIVOT实现行转列与列转行!!!

时间:2022-11-11 14:56:42浏览次数:63  
标签:name stu Students SQLSERVER hours 转列 UNPIVOT hobby SELECT

原文链接:https://www.cnblogs.com/wypd/archive/2022/05/07/16242851.html

  

一、使用PIVOT实现行转列

1、首先创建一个学生表

CREATE TABLE [dbo].[Students](
          [stu_id] [int] IDENTITY(1,1) NOT NULL,
          [stu_name] [varchar](100) NULL,
          [stu_hobby] [varchar](100) NULL,
         [stu_hours] [int] NULL
) ON [PRIMARY]

2、插入几条数据

INSERT INTO [Students](stu_name,stu_hobby,stu_hours)
VALUES ('用户A','唱歌','2')
,('用户A','跳舞','5')
,('用户B','唱歌','5')
,('用户B','跳舞','3')
,('用户C','唱歌','1')
,('用户C','跳舞','5')
,('用户D','游泳','5')
,('用户D','跳舞','5')

3、针对某一列将其转化为列,这里使用到的是stu_hobby

SELECT * FROM (
    SELECT stu_name,stu_hobby,stu_hours FROM [Students]
)t
PIVOT(SUM(stu_hours)
FOR stu_hobby IN (唱歌,跳舞,游泳))piv

【效果对比如下:】

(1)转换前:

(2) 转换后:

 

4、如果我们想要动态把某一行转换成列,并不想每次增加一种爱好都要去手动去改一下sql,我们可以通过声明变量的方式来实现

4.1 这里我们添加一种【健身】的爱好

   INSERT INTO [Students](stu_name,stu_hobby,stu_hours)
  VALUES ('用户D','健身','5')

4.2 使用声明变量的sql

DECLARE @sql VARCHAR(MAX);
DECLARE @tempField VARCHAR(MAX)=(SELECT STUFF((SELECT ','+stu_hobby FROM [Students] GROUP BY stu_hobby FOR XML PATH('')),1,1,''));
SET @sql='
SELECT * FROM (
SELECT stu_name,stu_hobby,stu_hours FROM [Students]
)t
PIVOT(SUM(stu_hours)
FOR stu_hobby IN ('+@tempField+'))piv
'
EXEC(@sql)

 效果图如下:

 这样你没添加一种爱好,都会自动的去把这个爱好转换成列,就不用每增加一种,就需要手动在in后面去把爱好补充上去了

 

二、使用UNPIVOT实现列转行

1、这里是将stu_hobby和stu_name两列转成了行展示

SELECT 转换后字段名,T,stu_hours FROM [Students]
UNPIVOT
(
T FOR 转换后字段名 IN(stu_hobby,stu_name)
)un

【效果对比如下:】

(1)转换前:

 (2)转换后:

标签:name,stu,Students,SQLSERVER,hours,转列,UNPIVOT,hobby,SELECT
From: https://www.cnblogs.com/alannxu/p/16880443.html

相关文章

  • SQLServer 中的group by(记录下常错的地方)
    https://www.cnblogs.com/jingfengling/p/5962182.html简单用法就不写了。原始表: 1、GroupBy中Select指定的字段限制示例select类别,sum(数量)as数量之和,摘......
  • C# 连接SQLSERVER数据库常用操作类
    //数据库连接字符串publicstaticstringconnectStr=@"server=.;database=test;uid=sa;pwd=123456;";///<summary>///增删改操作类......
  • SQLServer比较两个数据库的对象
     两个变量,表示要比较的数据库名:@SourceDatabase@DestinationDatabaseDECLARE@SourceDatabaseVARCHAR(50)DECLARE@DestinationDatabaseVARCHAR(50)DECLARE@SQL......
  • SqlServer高性能批量插入
    从内存占用大小、执行时间长短、实现复杂程度来衡量几种方法1.一次性加载数据到内存、再一条条插入2.使用yield逐批次加载到内存,数据库中为表添加【用户自定义表类型】(又......
  • Sqlserver 导出表数据类型和字段详细信息
    USE[DatabaseName]goSETANSI_NULLSON;GOSETQUOTED_IDENTIFIERON;GO--=============================================--Description:<生成数据库......
  • SqlServer 使用 count功能查询数量
     1、返回的是一个object类型,也就是说是所有数据类型的基类,可根据select所得的第一列的数据类型转换为对应的数据类型intcount=(int)cmd.ExecuteScalar();2、当sel......
  • Hive 行转列 列转行
    行转列CONCAT(stringA/col,stringB/col…):返回输入字符串连接后的结果,支持任意个输入字符串;CONCAT_WS(separator,str1,str2,...):它是一个特殊形式的CONCAT()。第......
  • SQLServer数据库优化
    当遇到如下250的SQL时,又没办法改SQL,只能优化数据库的情况下。索引pid,no,equipmentCode,和索引pid,有着巨大的差异。在索引中包含orderby的列,将极大提升速度。ROW_NUMB......
  • Zabbix 5.0 监控 SQLSERVER的配置方法
    0x01环境说明zabbix server5.0  zabbixagent25.0.28windowsserver2019  防火墙已关闭,也可开启放行相关端口SQLSERVER2016 0x02配置准备freetds......
  • MySQL函数-Group_Concat分组并行转列
    group_concat函数解析:1、concat()函数:  功能:将多个字符串连接成一个字符串  语法:concat(str1,str2)  结果:连接参数str1,str2为一个字符串,如果有任何一个参数为n......