SQLServer之行数据转换为列数据

Posted vuenote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLServer之行数据转换为列数据相关的知识,希望对你有一定的参考价值。

准备工作

创建表

 1 use [test1]
 2 go
 3 
 4 create table [dbo].[student](
 5     [id] [int] identity(1,1) not null,
 6     [name] [nvarchar](50) null,
 7     [project] [nvarchar](50) null,
 8     [score] [int] null,
 9  constraint [pk_student] primary key clustered 
10 (
11     [id] asc
12 )with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
13 ) on [primary]
14 go

插入数据

1 insert into test1.dbo.student(name,project,score)
2 values(张三,android,60),
3       (张三,ios,70),
4       (张三,html5,55),
5       (张三,.net,100),
6       (李四,android,60),
7       (李四,ios,75),
8       (李四,html5,90),
9       (李四,.net,100);

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

语法

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

语法解析

column_name

数据列列名

aggregation function

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

case when expression

case when表达式

示例

1 select name,
2 max(case project when android then score end) as 安卓,
3 max(case project when ios then score end) as 苹果,
4 max(case project when html5 then score end) as html5,
5 max(case project when .net then score end) as .net
6 from [test1].[dbo].[student]
7 group by name

示例结果

转换前

技术图片

转换后

技术图片

使用PIVOT进行行专列

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

 语法

 1 select <non-pivoted column>,  
 2     [first pivoted column] as <column name>,  
 3     [second pivoted column] as <column name>,  
 4     ...  
 5     [last pivoted column] as <column name>  
 6 from  
 7     (<select query that produces the data>)   
 8     as <alias for the source query>  
 9 pivot  
10 (  
11     <aggregation function>(<column being aggregated>)  
12 for   
13 [<column that contains the values that will become column headers>]   
14     in ( [first pivoted column], [second pivoted column],  
15     ... [last pivoted column])  
16 ) as <alias for the pivot table>  
17 <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>

排序规则。

示例

 1 select b.Name,b.[android],b.[ios],b.[html5],b.[.net] 
 2 from  
 3 (select Name,Project,Score from [test1].[dbo].[student])
 4 as a
 5 pivot
 6 (
 7     max(Score)
 8     for Project in ([android],[ios],[html5],[.net])
 9 ) 
10 as b
11 order by b.name desc

示例结果

转换前

技术图片

转换后

技术图片

注意事项

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

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

 

以上是关于SQLServer之行数据转换为列数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - Pivot 将行转换为列(带有额外的行数据)

SQL Server试图将数据从行转换为列

MS Access SQL 将行转换为列

SQL Server 2008 R2,将列转换为行,将行转换为列[重复]

如何在 SQL Server 中将行动态转换为列

建议将行转换为列的方法