SQLServer处理行转列和列转行

掌握SQL Server 行转列和列转行

1、列转行

数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据。

1.1 列换行语法

table_source

UNPIVOT(

value_column

FOR pivot_column

IN(<column_list>)

)

1.2  行转列案例

WITH T
AS
(
    SELECT 1 as TeamId,‘测试团队1‘ as Team,80 ‘MEN‘,20 ‘WOMEN‘
    UNION
    SELECT 2 as TeamId,‘测试团队2‘ as Team,30 ‘MEN‘,70 ‘WOMEN‘
)

---列转行------------------------------------
SELECT TeamId,Team ,TYPE=ATTRIBUTE,CNT=VALUE
FROM T
UNPIVOT (
  VALUE FOR ATTRIBUTE IN ([MEN],[WOMEN])
) AS UPV

2、 行转列

行转列主要是从中间表里查询数据,SQL SERVER2005以下的版本则可以使用聚合函数来完成。

2.1 行转列语法

table_source

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(<column_list>)

)

2.2、使用PIVOT实现

WITH T
AS
(
  SELECT  1 AS ID,‘测试团队1‘ TEAM,‘MEN‘ ITEM,80 CENT
  UNION
  SELECT  1 AS ID,‘测试团队1‘ TEAM,‘WOMEN‘ ITEM,20 CENT
  UNION
  SELECT  2 AS ID,‘测试团队2‘ TEAM,‘MEN‘ ITEM,30 CENT
  UNION
  SELECT  2 AS ID,‘测试团队2‘ TEAM,‘WOMEN‘ ITEM,70 CENT
)

SELECT * FROM T PIVOT (SUM(CENT) FOR ITEM IN ([MEN],[WOMEN])) A

2.3、使用聚合函数实现

WITH T
AS
(
  SELECT  1 AS ID,‘测试团队1‘ TEAM,‘MEN‘ ITEM,80 CENT
  UNION
  SELECT  1 AS ID,‘测试团队1‘ TEAM,‘WOMEN‘ ITEM,20 CENT
  UNION
  SELECT  2 AS ID,‘测试团队2‘ TEAM,‘MEN‘ ITEM,30 CENT
  UNION
  SELECT  2 AS ID,‘测试团队2‘ TEAM,‘WOMEN‘ ITEM,70 CENT
)

SELECT ID,TEAM,
SUM(CASE WHEN ITEM=‘MEN‘ THEN CENT ELSE 0 END) ‘MEN‘,
SUM(CASE WHEN ITEM=‘WOMEN‘ THEN CENT ELSE 0 END) ‘WOMEN‘
FROM T
GROUP BY ID,TEAM

参考资料

http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html

http://www.cnblogs.com/aspnethot/articles/1762665.html

时间: 2024-10-22 16:00:04

SQLServer处理行转列和列转行的相关文章

sqlserver 行转列、列转行[转]

转自:http://www.cnblogs.com/luofuxian/archive/2012/02/23/2364328.html Sql Server 行转列.列转行 创建表: CREATE TABLE [dbo].[tbl_Student]( [ID] [int] IDENTITY(1,1) NOT NULL, [学生ID] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [学生姓名] [nvarchar](50) COLLATE Chines

做图表统计你需要掌握SQL Server 行转列和列转行

说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例

oracle 行转列、列转行

最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max(date_201501) as date_201501,max(date_201502),max(date_201503),max(date_201504) from (select t.user_name,case when t.acct_date = '201501' then t.flow

重温SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列 CREATE TAB

SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列 CREATE TAB

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

行转列或列转行写法

原文:行转列或列转行写法 两种方式: /* 实现行转列 a name objec score a EN 89 a CH 78 a HO 99 b EN 34 b CH 88 b HO 66 要求输出结果为: name EN CH HO a 89 78 99 b 34 88 66 */ USE tempdb IF (SELECT 1 FROM sys.sysobjects WHERE name ='t' AND type='u') is NOT NULL DROP TABLE t CREATE T

sql中的行转列和列转行的问题

sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题  简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) GO INSERT INTO #T VALUES(1,2,3) GO SELECT * FROM #T --行转列:(union all) SELECT MON1 FROM #T UNION ALL SELECT MON2 FROM #T UNION ALL SELECT MON3 FROM #T G

sql的行转列和列转行

一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SELECT '张三', '语文', 80 INSERT INTO [StudentScores] SELECT '张三', '数学', 90 INSERT INTO [StudentS