Ⅰ sql 列转行
http://www.itpub.net/thread-1017026-1-1.html# oracle行列转化
Ⅱ 急求 sql 动态行变列
CREATETABLETestRowCol(
nameVARCHAR(10),
placeVARCHAR(10),
valuwINT
);
INSERTINTOTestRowColVALUES('张三','东',1);
INSERTINTOTestRowColVALUES('张三','南',2);
INSERTINTOTestRowColVALUES('张三','西',3);
INSERTINTOTestRowColVALUES('张三','北',4);
INSERTINTOTestRowColVALUES('李四','东',5);
INSERTINTOTestRowColVALUES('李四','南',6);
INSERTINTOTestRowColVALUES('李四','西',7);
INSERTINTOTestRowColVALUES('李四','北',8);
注:下面的SQL是在SQLServer2005及以上版本可用。(SQLServer2000及以下版本的,下面的写法不支持)
使用CASEWHEN方式的动态处理.
BEGIN
--主SQL.
DECLARE@MainSqlvarchar(2000);
--产生动态列的SQL.
DECLARE@ColumnSqlvarchar(1000);
--设置产生动态列的SQL.
SET@ColumnSql=
(
SELECT
',SUM(CASEWHENplace='''+place+'''THENvaluwELSE0END)AS'+place
FROM
TestRowCol
GROUPBY
place
FORXMLPATH('')
);
--设置主SQL.
SET@MainSql=
'SELECTname'+@ColumnSql+'FROMTestRowColGROUPBYname';
--执行主SQL.
EXECUTE(@MainSql);
END
GO
name北东南西
------------------------------------------------------
李四8567
张三4123
使用PIVOT方式的动态处理.
BEGIN
--主SQL.
DECLARE@MainSqlvarchar(2000);
--产生动态列的SQL.
DECLARE@ColumnSqlvarchar(1000);
--设置产生动态列的SQL.
SET@ColumnSql=
STUFF(
(
SELECT
','+place
FROM
TestRowCol
GROUPBY
place
FORXMLPATH('')
),1,1,'');
--设置主SQL.
SET@MainSql=
'SELECT*FROMTestRowCol'
+'PIVOT(SUM(valuw)FORplaceIN('
+@ColumnSql
+'))tmpORDERBYname';
--执行主SQL.
EXECUTE(@MainSql);
END
GO
name北东南西
------------------------------------------------------
李四8567
张三4123
(2行受影响)
Ⅲ 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的方法。
Ⅳ sql动态实现行列转换
题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
Ⅳ sql语句列转行
我整理的行转列的问题:
--创建tb表
createtabletb(姓名varchar(10),课程varchar(10),分数int)
insertintotbvalues('张三','语文',74)
insertintotbvalues('张三','数学',83)
insertintotbvalues('张三','物理',93)
insertintotbvalues('李四','语文',74)
insertintotbvalues('李四','数学',84)
insertintotbvalues('李四','物理',94)
go
select*Fromtb
--SQLSERVER2000静态行转列
select姓名as姓名,
max(case课程when'语文'then分数elsenullend)语文,
max(case课程when'数学'then分数elsenullend)数学,
max(case课程when'物理'then分数elsenullend)物理
fromtb
groupby姓名
--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare@sqlvarchar(8000)
set@sql='select姓名'
select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'
from(selectdistinct课程fromtb)asa
set@sql=@sql+'fromtbgroupby姓名'
exec(@sql)
--SQLSERVER2005静态SQL。
select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b
--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+'],[','')+课程fromtbgroupby课程
set@sql='['+@sql+']'
exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')
希望对你的学习有帮助。
Ⅵ sql 动态行列转换语句解释,要求对每一条语句进行解释,主要是看不懂动态的列是怎么循环出来的
其实这个是组合的一条sql语句,
declare @sql varchar(8000) --声明一个变量
set @sql = 'select 姓名' --为这个变量赋值
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
--更加课程这个字段来给分数排序(case 。。。。 then ..。。。表示当课程这个字段位某个值的时候给这个分数赋值,否则该课程分数为0) max()函数表示给根据课程的字母来排序
(select distinct 课程 from tb) as a--表示查询tb的表中不重复的课程 然后把结果转换为a
set @sql = @sql + ' from tb group by 姓名' --根据姓名来做排序
exec(@sql) --执行组合的sql语句
Ⅶ Sql动态列转行,该怎么解决
SELECT INDEXDEF , REGEXP_SUBSTR(GRADECODE , '[^,]+', 1, LEVEL, 'i') GRADECODE FROM tt CONNECT BY LEVEL
Ⅷ sql列转行
为何硬是要到数据库里变换呢?程序后台代码不是很好操作么?
Ⅸ sql动态多行转列,PIVOT怎么能转两列
楼上那个用过sqlserver吗?
PIVOT是支持的!!!!!
不过看你的语法,肯定报错。PIVOT最好基于SELECT * 并且先把全部需求的字段转换未列:
select * from
(select CONVERT(varchar(100),年月)+'受理' 栏位,sum(受理数量) 数量 from
表a
GROUP BY 年月
UNION ALL
select CONVERT(varchar(100),年月)+'办结'栏位,sum(办结数量) 数量 from
表a
GROUP BY 年月)v
PIVOT ( MAX(v.数量) FOR v.栏位 IN ( [2019-01受理],
[2019-02受理],
[2019-03受理],
[2019-04受理],
[2019-01办结],
[2019-02办结],
[2019-03办结],
[2019-04办结] )) 网络知道回答用
Ⅹ sql语句 列变行 行变列
--SQL Server 2005以上版本用unpivot
use Tempdb
go
--> -->
if not object_id(N'Tempdb..#1') is null
drop table #1
Go
Create table #1([区域名称] nvarchar(3),[小类1] int,[小类2] int,[小类3] int)
Insert #1
select N'奎文区',120,100,90
Go
select
[区域名称],[分类],[值]
from
#1
unpivot
([值] for [分类] in([小类1],[小类2],[小类3]))b
/*
区域名称 分类 值
奎文区 小类1 120
奎文区 小类2 100
奎文区 小类3 90
*/