A. 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
B. sql 最简单的列转行
oracle中列传行可用wm_concat来实现。
如test表中数据如下:
现要将name列一列显示成行,可用如下语句:
select wm_concat(name) from test;结果:
C. mysql列转行(逗号分隔)
mysql查询含逗号的数据,将逗号拆分为多行展示:
原始数据如下:
现在因为新的需求,需要将这些数据转化为如下形式:
假设我们需要处理的表结构为:
使用如下sql语句即可实现需求:
查询的主要思路为,原表与一个包含连续自增长字段的表进行join,得到字符串分隔后的索引值,其中 length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 语句获得字符串逗号分隔之后得到的数据长度,两表关联之后,会得到相应行数的数据。比如,
在join之后会得到:
之后对查询中的结果,使用substring_index方法进行截取,然后得到我们自己想要的数据。
D. sql server 列转行
SQL Server 2005之后支持pivot关键字。
select year,[1],[2],[3],[4]
from 表A
pivot(max(num) for [month] in ([1],[2],[3],[4])) as pvt
SQL Server 2000以及之前版本,可以参考imlees的方法。
E. sql列转行,如何把表转化为这个结果一共一行 一列.如何实现.
通用的办法是用动态sql解决:
declare@sqlvarchar(2000);
set@sql='select''';
select@sql=@sql+列名+','from表名;
select@sql=left(@sql,len(@sql)-1)+''''
exec(@sql);
此外,SQL Server2005以上版本可以用XML Path解决。
SELECT列名+','FROM表名FORXMLPATH('')
这样将直接得到'a,b,c,d,d,e,',需要进一步处理去掉最后的逗号
F. 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>)
)
G. MS SQL SERVER 如何把多列的值 , 变成一列多行 .
行转列,列转行是我们在开发过程中经常碰到的问题
行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。用传统的方法,比较好理解。层次清晰,而且比较习惯。
但是PIVOT 、UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单、更具可读性.
--行转列的静态方案一:CASE WHEN,兼容sql2000
select custid,
3 sum(case when YEAR(orderdate)=2002 then qty end) as [2002],
sum(case when YEAR(orderdate)=2003 then qty end) as [2003],
sum(case when YEAR(orderdate)=2004 then qty end) as [2004]
from orders
group by custid;--行转列的静态方案二:PIVOT,sql2005及以后版本
select *
from (select custid,YEAR(orderdate) as years,qty from orders) as ord
pivot(sum(qty) for years in([2002],[2003],[2004]))as p