1. sqlServer 列转行
sql server 请参阅下面的代码,列转行
sqlserver列转行方法分享
以下例子适用 sqlserver 2005版本及以上
createtableA(info1varchar(30),
[2012]int,
[2008]int,
[2018]int,
[2013]int
)
go
insertintoAvalues('A',8,null,null,20)
insertintoAvalues('B',null,7,null,3)
insertintoAvalues('C',12,4,null,null)
insertintoAvalues('D',null,null,5,16)
go
---列行转换适用于sqlserver2005及以上版本
SELECTinfo1,nian,qty
fromA
unpivot(qtyfornianin([2012],[2008],[2018],[2013]))astest
GO
truncatetableA
droptableA
2. SQL Server 2008列转行问题
第一个结果的格式, 你先看看?合适不合适?
With myCTE AS (
select
ROW_NUMBER() over(partition by begin_time, end_time, LEFT(op_id,1) ORDER BY op_id) AS NO,
operator.*
from
operator
)
SELECT
begin_time AS [开始时间],
end_time AS [结束时间],
MAX(CASE WHEN LEFT(op_id,1) = '1' THEN op_id else '' END) AS [一组工号],
MAX(CASE WHEN LEFT(op_id,1) = '1' THEN work_time else NULL END) AS [工作时长],
MAX(CASE WHEN LEFT(op_id,1) = '2' THEN op_id else '' END) AS [二组工号],
MAX(CASE WHEN LEFT(op_id,1) = '2' THEN work_time else NULL END) AS [工作时长],
MAX(CASE WHEN LEFT(op_id,1) = '3' THEN op_id else '' END) AS [三组工号],
MAX(CASE WHEN LEFT(op_id,1) = '3' THEN work_time else NULL END) AS [工作时长]
FROM
myCTE
GROUP BY
begin_time, end_time, NO
第二个结果的格式
SELECT
begin_time AS [开始时间],
end_time AS [结束时间],
SUM( CASE WHEN LEFT(op_id,1) = '1' THEN 1 ELSE 0 END ) AS [一组上班人数],
SUM( CASE WHEN LEFT(op_id,1) = '2' THEN 1 ELSE 0 END ) AS [二组上班人数],
SUM( CASE WHEN LEFT(op_id,1) = '3' THEN 1 ELSE 0 END ) AS [三组上班人数]
FROM
operator
GROUP BY
begin_time, end_time
3. 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>)
)
4. sql 2008两列的表如何可以转换为一行表
通用的办法是用动态sql解决:
declare @sql varchar(2000);
set @sql='select ''';
select @sql=@sql+列名+',' from 表名;
select @sql=left(@sql,len(@sql)-1)+''''
exec(@sql);
此外,SQL Server2005以上版本可以用XML Path解决。
SELECT 列名+',' FROM 表名 FOR XML PATH('')
这样将直接得到'a,b,c,d,d,e,',需要进一步处理去掉最后的逗号。
5. 关于SQL SERVER 2008 列转行的问题
给你一个网址,说的比较详细 http://blog.csdn.net/yubofighting/article/details/6767390
6. sql2008列转行语句
http://blog.csdn.net/greystar/article/details/5660645
看看上面三种方法是不是你需要的。
7. SQLSERVER 列转行
第一:你的时间维度表基本没有意义,微软SSIS中心认为时间维度至少由日期构成主键。可以认为是最小基本业务颗粒。
来个Sample,更复杂的在我空间里。但是道理是一样的。都是借助动态SQL和一些函数。
----------------------------------------------------------------
/*
作者:Edwin
数据库:SQLSERVER2005+
作用:指定时间区间的自然周有几天,如果垮年度,由外围验证
Version1.0
Copyright(c)2015,SQLSERVER2008
*/
----------------------------------------------------------------
/*参数设定区域,参数为开始时间和结束时间*/
----------------------------------------------------------------
declare@FDateDateTimeset@FDate='2014-09-0100:00:00.000'
declare@EdateDateTimeset@Edate='2015-01-0100:00:00.000'
----------------------------------------------------------------
/*SQL主体*/
----------------------------------------------------------------
declare@WeekHeadernvarchar(max)
select@WeekHeader=coalesce(@WeekHeader+',['+cast(WeekOfYearasvarchar)+']','['+cast(WeekOfYearasvarchar)+']')
from
(
selectWeekOfYearfromComn.CalendarwhereDatePerDay>=@FDateandDatePerDay<@EdategroupbyWeekOfYear
)M
declare@PivotSQLnvarchar(max)set@PivotSQL=N'
select
Yearas年份,'+@WeekHeader+'
from
(
select[Year],WeekOfYear,DatePerDayfrom[DT_WareHouse].[Comn].[Calendar]whereDatePerDay>=@FDateandDatePerDay<@Edate
)M
pivot
(
count(DatePerDay)for[WeekOfYear]in('+@WeekHeader+')
)PVT'
execsp_executesql@PivotSQL,N'@FDatedatetime,@Edatedatetime',@FDate,@Edate
执行结果:
8. sql server 列转行问题
如果是写程序,就按你的要求直接输出就好了。
如果只是要数据,可以把查询的结果复制到excel中,然后在excel中利用转置(粘贴时的一个选择项)的功能可以实现你的要求。
9. SQL SERVER 2008 复杂行转列
创建表,数据
createtabletest
(合同编号varchar(10),
付款日期varchar(10),
付款金额int,
序号varchar(2))
insertintotestvalues('JNHS1501','2015-01-01',2600000,1)
insertintotestvalues('JNHS1501','2015-04-01',1000000,2)
insertintotestvalues('JNHS1501','2015-04-27',2000000,3)
insertintotestvalues('JNHS1501','2015-04-16',1500000,4)
insertintotestvalues('JNHS1501','2015-05-26',2000000,5)
insertintotestvalues('JNHS1501','2015-06-16',2000000,6)
insertintotestvalues('JNHS1501','2015-07-29',684770,7)
insertintotestvalues('JNHS1502','2015-05-05',180000,1)
insertintotestvalues('JNHS1502','2015-01-05',50000,2)
执行
declare@sqlvarchar(4000)
set@sql='select合同编号'
select@sql=@sql+',max(case序号when'''+[序号]+'''then[付款日期]end)as
付款日期'+序号+',max(case序号when'''+[序号]+'''then[付款金额]end)as
付款金额'+序号+''
from(selectdistinct序号fromtest)asa
select@sql=@sql+'fromtestgroupby合同编号'
exec(@sql)
结果:
10. SqlServer2008中,怎么进行 行转列
--除去第二行,要么你直接delete,要么给一个规则,去最大?最小?还是相加,自己处理一下
if OBJECT_ID('tb') is not null
drop table tb
go
create table tb (id int,AttachName int,AttachNum int,AttachReSerNum int,AttachSerNum int)
insert into tb
select 4,1,1,12313,123 union all
select 4,1,1,312313,123131 union all
select 5,2,1,1231231,123123
DECLARE @SQL VARCHAR(8000),@SQL1 VARCHAR(8000)
DECLARE @I INT,@COUNT INT,@COLUMN VARCHAR(20)
SELECT @SQL = ISNULL(@SQL + '],[' , '') + CONVERT(VARCHAR(10),ID) FROM tb GROUP BY ID
SET @SQL = '[' + @SQL + ']'
select @sql1=isnull(@sql1,'')+'SELECT '''+a.name+''' as 属性,'+@sql+'
FROM (
SELECT ID,MIN('+a.name+') as '+a.name+'
FROM tb
group by ID
) A PIVOT (MAX('+a.name+') FOR ID IN (' + @SQL + ')) B union all
'
from sys.all_columns as a
where a.object_id=object_id('tb') and a.name!='ID'
set @SQL1=substring(@sql1,0,len(@sql1)-11)
exec(@sql1)
------------------------------------
属性 4 5
-------------- ----------- -----------
AttachName 1 2
AttachNum 1 1
AttachReSerNum 12313 1231231
AttachSerNum 123 123123