Ready to work
Create a table
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
Insert data
. 1 INSERT INTO test1.dbo.student (name, Project, Score)
2 values ( ' John Doe ' , ' Android ' , ' 60 ' ),
. 3 ( ' John Doe ' , ' iOS ' , ' 70 ' ),
. 4 ( ' John Doe ' , ' HTML5 ' , ' 55 ' ),
. 5 ( ' John Doe ' ,'.NET ' , ' 100 ' ),
. 6 ( ' John Doe ' , ' Android ' , ' 60 ' ),
. 7 ( ' John Doe ' , ' iOS ' , ' 75 ' ),
. 8 ( ' John Doe ' , ' HTML5 ' , ' 90 ' ),
9 ( ' John Doe ' ,'.net','100');
Use Case When line train and polymerized functions
grammar
1 select column_name, 2 <aggregation function>(<case when expression>) 3 from database.schema.table 4 group by column_name
Parsing
column_name
Data Column names
aggregation function
Aggregate functions, common are: sum, max, min, avg, count the like.
case when expression
case when expression
Examples
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
Sample results
Conversion ago
After conversion
PIVOT carried out using special train line
PIVOT
By the expression a unique value in the output into a plurality of columns rotating table value expression. And PIVOT
run the polymerization in the final output on any remaining column values need PIVOT
to provide more than a series of complex SELECT...CASE
syntax simpler and more readable syntax statement specified, PIVOT
perform aggregation and possible multiple rows into a single row in the output .
grammar
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、输出的所有列的列名的数据类型必须一致。