码迷,mamicode.com
首页 > 数据库 > 详细

SQLServer之行数据转换为列数据

时间:2019-07-28 17:54:44      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:weight   多行   case when   table   name   use   prim   when   技术   

准备工作

创建表

 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之行数据转换为列数据

标签:weight   多行   case when   table   name   use   prim   when   技术   

原文地址:https://www.cnblogs.com/vuenote/p/11258616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!