SQLserver行转列与列转行

行表:

行表
姓名 属性 属性值
JACK 身高 180
JACK 体重 80
JACK 年龄 27
TOM 身高 164
TOM 体重 59
TOM 年龄 20

列表:

列表  
姓名 身高 年龄 体重
JACK 180 27 80
TOM 164 20 59

行转列就是将行表转换为列表,反之为列转行。

--==================================================================
----------------------------行转列----------------------------------
--==================================================================
-------------------------建立测试表
if exists(select * from sysobjects where ID=OBJECT_ID(N‘BodyInfo‘) AND XTYPE=‘U‘)
DROP TABLE BodyInfo
Create Table BodyInfo
(
 姓名      varchar(20),
 属性      VARCHAR(20),
属性值     int
)
------------------------插入测试数据
insert into BodyInfo
select ‘JACK‘,‘身高‘,180 union all
select ‘JACK‘,‘体重‘,80  union all
select ‘JACK‘,‘年龄‘,27  union all
select ‘TOM‘,‘身高‘,164 union all
select ‘TOM‘,‘体重‘,59  union all
select ‘TOM‘,‘年龄‘,20 

----------------------------------------方法一:使用静态SQL
select 姓名,
max(case 属性 when ‘身高‘ then 属性值 else 0 end) AS 身高,
max(case 属性 when ‘体重‘ then 属性值 else 0 end) As 体重,
max(case 属性 when ‘年龄‘ then 属性值 else 0 end) AS 年龄
from BodyInfo group by 姓名

----------------------------------------方法二:使用动态SQL
DECLARE @sql varchar(1000)
set @sql=‘select 姓名‘
select @sql=@sql+‘,max(case 属性 when ‘‘‘+属性+‘‘‘ then 属性值 else 0 end) AS ‘+属性+‘‘
from (select  distinct 属性 from BodyInfo) a
set @sql=@sql+‘ from BodyInfo group by 姓名‘
--print @sql
exec(@sql)

----------------------------------------方法三:使用isnull
go
/*isnull的语法是:ISNULL ( check_expression , replacement_value )
 参数
check_expression

将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

replacement_value

在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。

返回类型
返回与 check_expression 相同的类型。
*/
declare @sql varchar(8000)

select @sql=isnull(@sql+‘,‘,‘‘)+‘max(case 属性 when ‘‘‘+属性+‘‘‘ then 属性值 else 0 end) [‘+属性+‘]‘

from (select distinct 属性 from BodyInfo) b

set @sql=‘select 姓名,‘+@sql+‘ from BodyInfo group by 姓名‘
print @sql
exec(@sql)

--------------------------------------------------方法四:使用pivot

select * from  BodyInfo pivot(max(属性值)for 属性 in(身高,体重,年龄))a

--------------------------------------------------方法五:使用stuff扩展pivot多变量赋值

go
declare @sql varchar(8000)

set @sql=‘‘  --初始化变量@sql

select @sql=@sql+‘,‘+属性 from BodyInfo group by 属性--变量多值赋值

set @sql=stuff(@sql,1,1,‘‘)--去掉首个‘,‘

set @sql=‘select * from BodyInfo pivot (max(属性值) for 属性 in (‘+@sql+‘))a‘

exec(@sql)

------------------------------------------方法六:使用isnull扩展pivot多变量赋值

go

declare @sql varchar(8000)

select @sql=isnull(@sql+‘,‘,‘‘)+属性 from BodyInfo group by 属性           

set @sql=‘select * from BodyInfo pivot (max(属性值) for 属性 in (‘+@sql+‘))a‘

exec(@sql)

--==================================================================
----------------------------列转行----------------------------------
--==================================================================
--建立测试表
if exists(select * from sysobjects where id=OBJECT_ID(N‘personInfo‘) AND XTYPE=‘U‘)
DROP TABLE personInfo
create table personInfo
(
  姓名 varchar(20),
  身高 int,
  年龄 int,
  体重 int
)
----插入测试数据
INSERT INTO personInfo
SELECT ‘JACK‘,180,27,80 UNION ALL
SELECT ‘TOM‘,164,20,59

-------------------------------------------------方法一:使用CASE...WHEN

select * from

(

 select 姓名,属性=‘身高‘,属性值=身高 from personInfo

 union all

 select 姓名,属性=‘体重‘,属性值=体重 from personInfo

 union all

 select 姓名,属性=‘年龄‘,属性值=年龄 from personInfo

) t

order by 姓名,case 属性 when ‘身高‘ then 1 when ‘体重‘ then 2 when ‘年龄‘ then 3 end

------------------------------------------------调用系统表
--调用系统表。
go
declare @sql varchar(8000)

select @sql=isnull(@sql+‘ union all ‘,‘‘)+‘ select 姓名, [属性]=‘

+quotename(Name,‘‘‘‘)+‘ , [属性值] = ‘+quotename(Name)+‘ from personInfo‘

from syscolumns

where Name!=‘姓名‘and ID=object_id(‘personInfo‘)--表名personInfo,不包含列名为姓名的其他列

order by colid

set @sql=@sql+‘ order by 姓名‘
--print @sql
exec(@sql)

-----------------------------------------------使用UNPIVOT
SELECT  姓名 ,
        属性 ,
        属性值
FROM    personInfo UNPIVOT ( 属性值 FOR 属性 IN ( [身高], [体重], [年龄] ) ) t 

----------------------------------------------使用isnull扩展UNPIVOT
go
DECLARE @sql NVARCHAR(4000)

SELECT  @sql = ISNULL(@sql + ‘,‘, ‘‘) + QUOTENAME(name)
FROM    syscolumns
WHERE   id = OBJECT_ID(‘personInfo‘)
        AND name NOT IN ( ‘姓名‘ )
ORDER BY colid

SET @sql = ‘select 姓名,[属性],[属性值] from personInfo unpivot ([属性] for [属性值] in(‘ + @sql
    + ‘))b‘

EXEC(@sql)
时间: 2024-08-02 18:58:34

SQLserver行转列与列转行的相关文章

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

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

行转列,列转行

oracle: ----------------------------- 行转列  --------------------------------select * from democreate table demo(id int,name varchar(20),nums int);  ---- 创建表insert into demo values(1, '苹果', 1000);insert into demo values(2, '苹果', 2000);insert into demo

做图表统计你需要掌握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

sqlserver 行转列 语文,数学,物理,化学

数据库查询行转列 1.原数据库值 stdname stdsubject result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 82 李四 化学 82 李四 化学 82 2.要得到如下表 stdname 语文 数学 物理 化学 李四 85 92 82 164 张三 80 90 85 NULL 3.实现方法 --第一种 调用行转列函数 select * from (select stdname,stdsubject,result from