sqlserver列变行,sqlserver一列转多行

sqlserver 怎么列转行

PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名网站空间、营销软件、网站建设、仪征网站维护、网站推广。

PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性-选项-兼容级别改为 90 )

SQL2008 中可以直接使用

完整语法:

table_source

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(column_list)

)

View Code

UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

完整语法:

table_source

UNPIVOT(

value_column

FOR pivot_column

IN(column_list)

)

SqlServer 列转行

sql server 请参阅下面的代码,列转行

sqlserver列转行方法分享

以下例子适用 sqlserver 2005版本及以上

create table A ( info1 varchar(30),

[2012] int,

[2008] int,

[2018] int,

[2013] int

)

go

insert into A values('A',8,null,null,20)

insert into A values('B',null,7,null,3)

insert into A values('C',12,4,null,null)

insert into A values('D',null,null,5,16)

go

---列行转换 适用于sql server 2005及以上版本

SELECT info1,nian,qty

from A

unpivot(qty for nian in([2012],[2008],[2018],[2013]))as test

GO

truncate table A

drop table A

sql语句怎么把列变成行

create table rotatetable1 (序号 int,company char(66),box_weight char(12),废塑料numeric(10,2)),废五金 numeric(10,2)),废钢铁 numeric(10,2)),废纸 numeric(10,2)),废有色 numeric(10,2)),废纤维 numeric(10,2)),其它 numeric(10,2)),合计 numeric(10,2)));

insert into rotatetable1(company,box_weight) select name ,'weight' from sum1 group by name;

insert into rotatetable1(company,box_weight) select name ,'box' from sum1 group by name;

update rotatetable1 set 废塑料=box from sum1as a where a.name=rotatetable1.company and box_weight='box' and hsname='废塑料';

update rotatetable1 set 废塑料=weight from sum1as a where a.name=rotatetable1.company and box_weight='weight' and hsname='废塑料';

::: :::

update rotatetable1 set 其它=box from sum1as a where a.name=rotatetable1.company and box_weight='box' and hsname='其它';

update rotatetable1 set 其它=weight from sum1as a where a.name=rotatetable1.company and box_weight='weight' and hsname='其它';

::: :::

update rotatetable1 set 合计=废塑料+废五金+废钢铁+废纸+废有色+废纤维+其它;

(所有涉及表的行列转换均可按照这种方式实现。)

SQLSERVER 列转行

第一:你的时间维度表基本没有意义,微软SSIS中心认为时间维度至少由日期构成主键。可以认为是最小基本业务颗粒。

来个Sample,更复杂的在我空间里。但是道理是一样的。都是借助动态SQL和一些函数。

----------------------------------------------------------------

/*

作者:Edwin

数据库:SQL SERVER 2005+

作用:指定时间区间的自然周有几天,如果垮年度,由外围验证

Version 1.0

Copyright (c) 2015, SQL SERVER 2008

*/

----------------------------------------------------------------

/*参数设定区域,参数为开始时间和结束时间*/

----------------------------------------------------------------

declare @FDate DateTime set @FDate = '2014-09-01 00:00:00.000'

declare @Edate DateTime set @Edate = '2015-01-01 00:00:00.000'

----------------------------------------------------------------

/*SQL主体*/

----------------------------------------------------------------

declare @WeekHeader nvarchar(max)

select @WeekHeader = coalesce(@WeekHeader+',['+cast(WeekOfYear as varchar)+']','['+cast(WeekOfYear as varchar)+ ']')

from 

(

select WeekOfYear from Comn.Calendar where DatePerDay=@FDate and DatePerDay@Edate group by WeekOfYear 

) M

declare @PivotSQL nvarchar(max) set @PivotSQL=N'

select

Year as 年份,'+@WeekHeader+'

from

(

select [Year],WeekOfYear,DatePerDay from [DT_WareHouse].[Comn].[Calendar] where DatePerDay=@FDate and DatePerDay@Edate

) M

pivot

(

count(DatePerDay) for [WeekOfYear] in('+@WeekHeader+')

) PVT'

exec sp_executesql @PivotSQL,N'@FDate datetime,@Edate datetime',@FDate,@Edate

执行结果:

在看一下时间维度表:

至于PVT标题别名问题,这个可以在时间维度表中创建字符串类型的第几周等样式的列来完成。

这种方式比较简单。

或是

----------------------------------------------------------------

/*

作者:Edwin

数据库:SQL SERVER 2005+

作用:指定时间区间的自然周销售,统计周期为某一年,如果垮年度,由外围验证

Version 1.0

Copyright (c) 2015, SQL SERVER 2008

*/

----------------------------------------------------------------

/*参数设定区域,参数为开始时间和结束时间*/

----------------------------------------------------------------

declare @FDate DateTime set @FDate = '2014-09-01 00:00:00.000'

declare @Edate DateTime set @Edate = '2015-01-01 00:00:00.000'

----------------------------------------------------------------

/*SQL主体*/

----------------------------------------------------------------

declare @WeekHeader nvarchar(max)

select @WeekHeader = coalesce(@WeekHeader+',['+cast(WeekOfYear as varchar)+']','['+cast(WeekOfYear as varchar)+ ']')

from 

(

select ('第'+cast(WeekOfYear as varchar)+'周') as WeekOfYear from Comn.Calendar where DatePerDay=@FDate and DatePerDay@Edate group by WeekOfYear 

) M

declare @PivotSQL nvarchar(max) set @PivotSQL=N'

select

Year as 年份,'+@WeekHeader+'

from

(

select [Year],(''第''+cast(WeekOfYear as varchar)+''周'') as WeekOfYear,DatePerDay from [DT_WareHouse].[Comn].[Calendar] where DatePerDay=@FDate and DatePerDay@Edate

) M

pivot

(

count(DatePerDay) for [WeekOfYear] in('+@WeekHeader+')

) PVT'

exec sp_executesql @PivotSQL,N'@FDate datetime,@Edate datetime',@FDate,@Edate

结果:


本文标题:sqlserver列变行,sqlserver一列转多行
分享地址:http://pwwzsj.com/article/hdjhsp.html