SQL Server基础之行数据转换为列数据

作者:小子pk了 时间:2024-01-19 22:16:00 

准备工作

创建表


use [test1]
go

create table [dbo].[student](
 [id] [int] identity(1,1) not null,
 [name] [nvarchar](50) null,
 [project] [nvarchar](50) null,
 [score] [int] null,
constraint [pk_student] primary key clustered
(
 [id] asc
)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
) on [primary]
go

插入数据


insert into test1.dbo.student(name,project,score)
values('张三','android','60'),
  ('张三','ios','70'),
  ('张三','html5','55'),
  ('张三','.net','100'),
  ('李四','android','60'),
  ('李四','ios','75'),
  ('李四','html5','90'),
  ('李四','.net','100');

使用Case When和聚合函数进行行专列

语法


select column_name,
<aggregation function>(<case when expression>)
from database.schema.table
group by column_name

语法解析

column_name

数据列列名

aggregation function

聚合函数,常见的有:sum,max,min,avg,count等。

case when expression

case when表达式

示例


select name,
max(case project when 'android' then score end) as '安卓',
max(case project when 'ios' then score end) as '苹果',
max(case project when 'html5' then score end) as 'html5',
max(case project when '.net' then score end) as '.net'
from [test1].[dbo].[student]
group by name

示例结果

转换前

SQL Server基础之行数据转换为列数据

转换后

SQL Server基础之行数据转换为列数据

使用PIVOT进行行专列

PIVOT通过将表达式中一列中的唯一值转换为输出中的多个列来旋转表值表达式。并PIVOT在最终输出中需要的任何剩余列值上运行聚合,PIVOT提供比一系列复杂的SELECT...CASE语句指定的语法更为简单和可读的语法,PIVOT执行聚合并将可能的多行合并到输出中的单个行中。

语法


select <non-pivoted column>,
 [first pivoted column] as <column name>,
 [second pivoted column] as <column name>,
 ...
 [last pivoted column] as <column name>
from
 (<select query that produces the data>)  
 as <alias for the source query>
pivot
(
 <aggregation function>(<column being aggregated>)
for  
[<column that contains the values that will become column headers>]  
 in ( [first pivoted column], [second pivoted column],
 ... [last pivoted column])
) as <alias for the pivot table>
<optional order by clause>;

语法解析

<non-pivoted column>

非聚合列。

[first pivoted column]

第一列列名。

[second pivoted column]

第二列列名。

[last pivoted column]

最后一列列名。

<select query that produces the data>

数据子表。

<alias for the source query>

表别名。

<aggregation function>

聚合函数。

<column being aggregated>

聚合函数列,用于输出值列,最终输出中返回的列(称为分组列)将对其进行分组。

[<column that contains the values that will become column headers>]

转换列,此列返回的唯一值将成为最终结果集中的字段。

[first pivoted column], [second pivoted column], ... [last pivoted column]

数据行中每一行行要转换的列名。

<optional order by clause>

排序规则。

示例


select b.Name,b.[android],b.[ios],b.[html5],b.[.net]
from
(select Name,Project,Score from [test1].[dbo].[student])
as a
pivot
(
 max(Score)
 for Project in ([android],[ios],[html5],[.net])
)
as b
order by b.name desc

示例结果

转换前

SQL Server基础之行数据转换为列数据

转换后

SQL Server基础之行数据转换为列数据

注意事项

1、如果输出列名不能在表转换列中,则不会执行任何计算。

2、输出的所有列的列名的数据类型必须一致。

来源:https://segmentfault.com/a/1190000019898109

标签:sqlserver,行转列
0
投稿

猜你喜欢

  • php基于curl主动推送最新内容给百度收录的方法

    2023-11-22 04:46:44
  • 让Python更加充分的使用Sqlite3

    2022-06-07 05:53:21
  • 讨论闭包传入参数:window & undefined

    2010-05-19 12:55:00
  • Python实现钉钉发送报警消息的方法

    2022-11-18 06:06:44
  • js循环改变div颜色具体方法

    2024-04-19 10:29:45
  • mpvue+vant app搭建微信小程序的方法步骤

    2024-05-29 22:22:42
  • 在Python开发环境中调用ChatGPT模型详细过程

    2022-03-25 21:59:29
  • MySQL中时间函数操作大全

    2024-01-14 19:45:11
  • PHP session有效期session.gc_maxlifetime

    2023-11-14 17:01:45
  • 教你如何用Python实现人脸识别(含源代码)

    2021-03-14 23:33:03
  • 网站中视觉元素的设计

    2008-04-27 20:47:00
  • JS+CSS实现闪烁字体效果代码

    2024-04-18 09:31:04
  • Gin golang web开发模型绑定实现过程解析

    2024-04-25 15:10:59
  • 对Python3中dict.keys()转换成list类型的方法详解

    2021-02-13 12:18:26
  • 字符,字节和编码

    2009-12-09 15:59:00
  • python进行两个表格对比的方法

    2021-12-15 20:31:57
  • 简单了解python反射机制的一些知识

    2022-02-05 15:01:04
  • 通过启动脚本来感受ASP的力量

    2008-11-07 15:25:00
  • Go语言实现文件上传

    2023-07-08 18:26:38
  • Python实现多态、协议和鸭子类型的代码详解

    2021-03-16 19:02:35
  • asp之家 网络编程 m.aspxhome.com