SQL行转列问题

一:前言
  在我们做的一些项目中经常会碰到把行转化为列的问题,这里进行总结一下:将下图一的格式转换为图二的格式。

图一

图二

二:首先向数据库插入数据。

IF OBJECT_ID(‘Tmark‘) IS NOT NULL DROP TABLE Tmark  /*判断数据库中是否存在Tmark表格*/

go

CREATE TABLE Tmark(Name VARCHAR(10),Course VARCHAR(10),Score INT)

insert into Tmark VALUES (‘张三‘,‘语文‘,74)
insert into Tmark VALUES (‘张三‘,‘数学‘,83)
insert into Tmark VALUES (‘张三‘,‘物理‘,93)
insert into Tmark VALUES (‘李四‘,‘语文‘,74)
insert into Tmark VALUES (‘李四‘,‘数学‘,84)
insert into Tmark VALUES (‘李四‘,‘物理‘,94)
insert into Tmark VALUES (‘王五‘,‘语文‘,86)
insert into Tmark VALUES (‘王五‘,‘数学‘,NUll)
insert into Tmark VALUES (‘王五‘,‘物理‘,NUll)

go

在数据库中有一个系统表sysobjects,里面存储了数据库各个对象的信息。可以查询下看看结果。可以看出每个对象都有一个ID,这个表存储了表,存储过程,触发器,视图等相关信息。

object_id就是根据对象名称返回该对象的id.
object_name是根据对象id返回对象名称.

select object_id(对象名)等同于:
select id from sysobjects where name=对象名

select object_name(id号)等同于:
select name from sysobjects where id=id号

SQL SERVER 2000以上版本都支持这个函数。

三:先从简单开始,由分组获得Name列

select Name from Tmark group by Name。

四:增加一列语文

现在我们想在这个结果集中再添加1列,多了我们不加,因为你不论是能处理语文,还是数学,还是物理列,

那么其他的列只要原样照抄就可以了,我们就只在现在的基础上添加一个语文列。

SELECT Name, CASE WHEN course = ‘语文‘ THEN score END FROM Tmark GROUP BY Name

我们看错误提示,Course 和Score 列要在聚合函数或者GROUP BY 子句中,那么我们先把Course 和Score 列放在GROUP BY 子句中

SELECT Name, CASE WHEN course = ‘语文‘ THEN score END FROM Tmark GROUP BY Name,Course ,Score

从结果看,数据倒是有了,可是行多了点,看来只能从聚合函数入手(聚合函数中的列可以不出现在Group By之后)

五:从聚合函数添加列

select Name, SUM(CASE WHEN Course = ‘语文‘ THEN Score END) AS 语文
from Tmark Group by Name

对于其他的列就可以直接复制,粘贴了。

SELECT Name,
SUM(CASE WHEN Course = ‘语文‘ THEN Score END) AS 语文,
SUM(CASE WHEN Course = ‘数学‘ THEN Score END) AS 数学,
SUM(CASE WHEN Course = ‘物理‘ THEN Score END) AS 物理
FROM Tmark GROUP BY Name

六:对Null的处理

对于没参加考试的同学,那么我们不应该显示‘NULL‘,应该显示为‘0‘,可是结果有NULL,那不太好,我们来把CASE WHEN THEN END写完,在此之间加个ELSE 0

1 SELECT Name,
2 SUM(CASE WHEN Course = ‘语文‘ THEN Score ELSE 0 END) AS 语文,
3 SUM(CASE WHEN Course = ‘数学‘ THEN Score ELSE 0 END) AS 数学,
4 SUM(CASE WHEN Course = ‘物理‘ THEN Score ELSE 0 END) AS 物理
5 FROM Tmark GROUP BY Name
6
7 go

时间: 2024-10-05 04:02:07

SQL行转列问题的相关文章

SQL 行转列查询汇总

SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_column) F

Sql 行转换为列 以及列转换为行的心得

这是 创建数据库的脚本文件 CREATE TABLE [dbo].[stu]( [学号] [nvarchar](255) NOT NULL, [姓名] [nvarchar](255) NULL, [性别] [nvarchar](255) NULL, [专业] [nvarchar](255) NULL, [院系] [nvarchar](255) NULL ) ON [PRIMARY] GO INSERT [dbo].[stu] ([学号], [姓名], [性别], [专业], [院系]) VALU

SQL 行转列

---1.最简单的行转列/* 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 李四 74   84   94张三 74   83   93*/--测试用 IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb] GO create table tb(姓名 varchar(10) , 课程 varchar(

SQL行转列汇总

SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_column)

sql 行转列总结

原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62 表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32 可使用sql2005之后提供的PIVOT 具体操作如下: select * from   t_table1

sql 行专列 列转行 普通行列转换

转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法.  问题:假设有张学生成绩表(tb)如

SQL行转列 (及EAV模型获取数据)

参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: 1 2 3 4 5 SELECT DISTINCT  a.name, (SELECT score FROM grade b

SQL行、列互转汇总

转自:http://www.cnblogs.com/maanshancss/archive/2013/03/13/2957108.html PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 )

sql行转列

近期在做项目时,用户给出了几张报表的需求,需要对数据进行汇总.在这个过程中,用到了关于sql语句行转列的方法.那么应该如何操作呢? 项目中的过程比较复杂,我就自己建立一个测试库来进行说明. 首先建立数据表test,添加三个字段:姓名(name,varchar2(10)).课程(course,varchar2(10)).分数(score,varchar2(10)). 插入数据: insert into test(name,course,score) values('victor','物理',70)