
正文
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)
)
相关问答
Q1: 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
Q2: 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
结果:
Q3: 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发的,要注意身体啊。






