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、输出的所有列的列名的数据类型必须一致。

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

时间: 2024-11-07 14:21:04

SQLServer之行数据转换为列数据的相关文章

多条Json数据转换为泛型数据

/// <summary> /// 单条json数据转换为实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="str">字符窜(格式为{a:'',b:''})</param> /// <returns></returns> private static T ConvertToEnt

jQqery EasyUI dategrid行中多列数据的可编辑操作

最近的项目中需要在前台dategrid列表中直接修改某些列的数据,并且修改后的数据需要不通过后台而自动更新在列表中. 带着这一问题开始寻找实现的思路,首先想到的就是去jQqery EasyUI官网找例子,看看有没有类似于这种的功能.当然,官网提供了两种:一是编辑修改datagrid中的某一个列的值:二是编辑修改datagrid中的某一行的值(demo网址:http://www.jeasyui.com/tutorial/datagrid/datagrid12.php). 效果图如下: 看到这两种d

如何将勾选中的行记录所有列数据传送到后台。

8379Kd631S柿http://huiyi.docin.com/fxa140 B12J51素N邢降1http://tushu.docin.com/bkfh0377 V7r佬1乖ZPF17裙http://www.docin.com/dtfc704 d寥锨胁丝霖g姨3Qhttp://huiyi.docin.com/azwa7079 C靖募繁孟暗0底徒何4a6http://jz.docin.com/sina_6367439043 pN菲斜e腿C唇腊亓6http://tushu.docin.com/

YUY数据转换为RGB数据,并进行灰度化处理显示

BYTE clip255(long Value){ BYTE retValue;  if (Value > 255)  retValue = 255; else if (Value < 0)  retValue = 0; else  retValue = (BYTE)Value; return retValue;}//win7采到的数据默认YUY格式,一个像素用2位表示,这里将YUY转换为RGB格式(3个字节),便于显示,不转换会出现黑框框void YUY2_RGB2_ljh(unsigned

Oracle数据更新、事务处理、数据伪列

一.数据的更新操作 DML操作语法之中,除了查询之外还有数据的库的更新操作,数据的更新操作主要指的是:增加.修改.删除数据,但是考虑到emp表以后还要继续使用,所以下面先将emp表复制一份,输入如下指令: CREATE TABLE myemp AS SELECT * FROM emp; 这种语法是Oracle中支持的操作,其他数据库不一样. 1.数据增加 如果现在要想实现数据的增加操作,则可以使用如下的语法完成: INSERT INTO 表名称 [(字段1,字段2,-)] VALUES(值1,值

java数据与json数据间的相互转换

java数据格式: class Test{ private String name: private String sex: private String brith: } json数据格式: {"name":"keke","sex":"male","brith":"0301"} 一.Java数据转换为json数据: 1.对象转换 Test test = new Test(); test

菜单数据(树形)结构的使用-- ---数据的列存储转换为行存储

一.菜单数据表中的存储结构 二.转换后的数据结构 三. 转换过程 1.确定菜单数据的最大级别 /// <summary> /// 获得Nature定义的最大目录级别,以便于确定Nature的DataTable表结构中的列数目 /// </summary> /// <returns></returns> public int GetMaxNatureLevel() { if (dtNature == null && dtNature.Rows.

根据一列数据 抽取另一个文件的行数据

方法一: 使用awk处理,先读入文件中的一列数据,然后在第二文件中做判断 awk -F'\t' 'FILENAME=="commUsers_Hotel"{F[$0]=1}FILENAME=="Hotel3"{if($0 in F){print}}' commUsers_Hotel Hotel3 > fugai 根据一列数据 抽取另一个文件的行数据,布布扣,bubuko.com

读取一个文件每行中的各列数据

读取一个文件每行中的各列数据 1.被读取的文件内容 [[email protected] leekwen]# cat userpwd 1412230101 ty001 1412230102 ty002 1512430102 ty003 1511230102 ty004 1411230102 ty002 1411240102 yt005 1412290102 yt012 1510230102 yt022 1512231212 yt032 2.脚本命令 [[email protected] leek