sqlserver列转行(sqlserver行列转换多行多列)

本篇文章给大家谈谈sqlserver列转行,以及sqlserver行列转换多行多列对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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

[img]

sqlserver列转行 查询

select * from A_14072201 

ID USERID

46859 38130

46859 888

46811 38130

46811 37761

46470 37836

46470 37836

46430 37836

46430 37836

select ID,USERID from A_14072201 

where ID in (select ID from (select ID,USERID from A_14072201 group by ID,USERID) as tableA group by ID having COUNT(*) = 2)

ID USERID

46859 38130

46859 888

46811 38130

46811 37761

select table1.ID,table1.USERID,table2.USERID 

from (select ID,USERID from (select ID,USERID,ROW_NUMBER() over (order by ID) 昌察罩ROWNUMBER from A_14072201 where ID in (select ID from (select ID,USERID from A_14072201 group by ID,USERID) as tableA group by ID having COUNT(*) = 2)) as tableB where ROWNUMBER % 2 = 1) table1 

inner join 

(select ID,USERID from A_14072201 where ID in (select ID from (select ID,USERID from A_14072201 group by ID,USERID) as tableA group by ID having COUNT(*) 没春= 2)) table2 

on table1.ID = table2.ID and table1.USERID  table2.USERID

ID USERID USERID

46811 38130 37761

46859 38130 888

--结果是对耐闹的,写的有点乱,你捋一捋然后优化一下,优化不了就直接改成表值函数去处理,我工作去了,话说你这个问题是半夜2:39发的,要注意身体啊。

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

结果:

sql 列转行

CREATE TABLE T1(A NUMBER,

b NUMBER,

c NUMBER,

d NUMBER,

e NUMBER);

insert into t1 values(1,2,3,4,5);

select * from t1;

select decode(A,1,'A',null) KEY ,decode(A,1,1,null) VALUE

from t1

union all

select decode(B,2,'B',null),decode(B,2,2,null)

from t1

union all

select decode(C,3,'C',null),decode(C,3,3,null)

from t1

union all

select decode(D,4,'D',null),decode(D,4,4,null)

from t1

union all

select decode(E,5,'E',null),decode(E,5,5,null)

from t1;

关于sqlserver列转行和sqlserver行列转换多行多列的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

Powered By Z-BlogPHP 1.7.2

备案号:蜀ICP备2023005218号