SqlServer普通行列转换

SqlServer普通行列转换
SqlServer普通行列转换

/*

标题:普通行列转换(version 2.0)

作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)

时间:-03-09

地点:广东深圳

说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(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 SERVER 2005 静态SQL。

select*from(select*from tb) a pivot(max(分数)for课程in(语文,数学,

物理)) b

--SQL SERVER 2005 动态SQL。

declare @sql varchar(8000)

select @sql =isnull(@sql +'],[','')+课程from tb group by课程

set @sql ='['+ @sql +']'

exec('select * from (select * from tb) a pivot (max(分数) for 课程in ('+ @sql +')) b')

---------------------------------

/*

问题:在上述结果的基础上加平均分,总分,得到如下结果:

姓名语文数学物理平均分总分

---- ---- ---- ---- ------ ----

李四74 84 94 84.00 252

张三74 83 93 83.33 250

*/

--SQL SERVER 2000 静态SQL。

select姓名姓名,

max(case课程when'语文'then分数else 0 end)语文,

max(case课程when'数学'then分数else 0 end)数学,

max(case课程when'物理'then分数else 0 end)物理,

cast(avg(分数*1.0)as decimal(18,2))平均分,

sum(分数)总分

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 +' , cast(avg(分数*1.0) as decimal(18,2)) 平均分, sum(分数) 总分from tb group by 姓名'

exec(@sql)

--SQL SERVER 2005 静态SQL。

select m.*, n.平均分, n.总分from

(select*from(select*from tb) a pivot(max(分数)for课程in(语文,数学,物理)) b) m,

(select姓名,cast(avg(分数*1.0)as decimal(18,2))平均分,sum(分数)总分from tb group by姓名) n

where m.姓名= n.姓名

--SQL SERVER 2005 动态SQL。

declare @sql varchar(8000)

select @sql =isnull(@sql +',','')+课程from tb group by课程

exec('select m.* , n.平均分, n.总分from

(select * from (select * from tb) a pivot (max(分数) for 课程in ('+ @sql + ')) b) m ,

(select 姓名, cast(avg(分数*1.0) as decimal(18,2)) 平均分, sum(分数) 总分from tb group by 姓名) n

where m.姓名= n.姓名')

drop table tb

------------------

------------------

/*

问题:如果上述两表互相换一下:即表结构和数据为:

姓名语文数学物理

张三74

李四74

想变成(得到如下结果):

姓名课程分数

---- ---- ----

李四语文74

李四数学84

李四物理94

张三语文74

张三数学83

张三物理93

--------------

*/

create table tb(姓名varchar(10),语文int,数学int,物理int)

insert into tb values('张三',74,83,93)

insert into tb values('李四',74,84,94)

go

--SQL SERVER 2000 静态SQL。

select*from

(

select姓名,课程='语文',分数=语文from tb

union all

select姓名,课程='数学',分数=数学from tb

union all

select姓名,课程='物理',分数=物理from tb

) t

order by姓名,case课程when'语文'then 1 when'数学'then2 when'物理'then 3 end

--SQL SERVER 2000 动态SQL。

--调用系统表动态生态。

declare @sql varchar(8000)

select @sql =isnull(@sql +' union all ','')+' select 姓名, [课程] = '+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb' from syscolumns

where name!= N'姓名'and ID =object_id('tb')--表名tb,不包含列名为姓名的其它列

order by colid asc

exec(@sql +' order by 姓名')

--SQL SERVER 2005 动态SQL。

select姓名,课程,分数from tb unpivot(分数for课程in([语文] ,[数学] ,[物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------

/*

问题:在上述的结果上加个平均分,总分,得到如下结果:

姓名课程分数

---- ------ ------

李四语文 74.00

李四数学 84.00

李四物理 94.00

李四平均分84.00

李四总分 252.00

张三语文 74.00

张三数学 83.00

张三物理 93.00

张三平均分83.33

张三总分 250.00

------------------

*/

select*from

(

select姓名as姓名,课程='语文',分数=语文from tb

union all

select姓名as姓名,课程='数学',分数=数学from tb

union all

select姓名as姓名,课程='物理',分数=物理from tb

union all

select姓名as姓名,课程='平均分',分数=cast((语文+数学+物理)*1.0/3 as decimal(18,2))from tb

union all

select姓名as姓名,课程='总分',分数=语文+数学+物理from tb

) t

order by姓名,case课程when'语文'then 1 when'数学'then2 when'物理'then 3 when'平均分'then 4 when'总分'then 5 end

drop table tb

2021年SQL语句大全实例

SQL语句实例 欧阳光明(2021.03. 07) 表操作 例1对于表的教学管理数据库中的表STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, 0) NOT NULL SNAME CHAR (8) NOT NULL AGE NUMERIC(3,0) SEX CHAR(2) BPLACE CHAR(20) PRIMARY KEY(SNO)) 例2对于表的教学管理数据库中的表ENROLLS ,可以定义如下:CREATE TABLE ENROLLS (SNO NUMERIC(6,0) NOT NULL CNO CHAR(4) NOT NULL GRADE INT PRIMARY KEY(SNO,CNO) FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO) FOREIGN KEY(CNO) REFERENCES COURSES(CNO)

*欧阳光明*创编2021.03.07 CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100))) 例3根据表的STUDENTS表,建立一个只包含学号.姓名.年龄的女学生表。 CREATE TABLE GIRL AS SELECT SNO, SNAME, AGE FROM STUDENTS WHERE SEX=女?; 例4删除教师表TEACHER。 DROP TABLE TEACHER 例5在教师表中增加住址列。 ALTER TABLE TEACHERS ADD (ADDR CHAR(50)) 例6把STUDENTS表中的BPLACE列删除,并且把引用 BPLACE列的所有视图和约束也一起删除。 ALTER TABLE STUDENTS DROP BPLACE CASCADE 例7补充定义ENROLLS表的主关键字。 ALTER TABLE ENROLLS ADD PRIMARY KEY (SNO,CNO);

excel表格怎样行变列

竭诚为您提供优质文档/双击可除excel表格怎样行变列 篇一:excel中的表格,行变列,列变行 如何让其行变列,列变行。并且其相关数据也能自动调整 1、启动excel,打开需要的,在当前中,选中需要进行行列转换的单元格区域,如a1:x6。 2、单击“编辑”菜单中的“复制”命令。 3、单击要存放转置表区域的左上角单元格,如a7。 4、单击“编辑”菜单中的“选择性粘贴”命令,系统“选择性粘贴”对话框,选中“转置”复选框。 5、单击[确定]按钮,则行列转置后的表格出现在a7:F30单元格区域。现在把a1:x6单元格区域删除,则完成了表格的行列转置。 怎样把woRd、excel中的表格,行变列,列变行? 在excel中是可以做到的,你将要转变的数据区域复制,在目标单元格处右击,选择“选择性粘贴”,将里面的“转置”选中,确定即可。 excel如何有规律列变行

我有份excel表有一列名字共4000个,我想转换成每行 8个名字,共500行.请问有没有什么简单的方法.请高手帮忙. 在这个工作表后面新建一个工作表 a1=indiRect("sheet1!a"&((Row(a1)-1)*8+column(a1))) 然后复制到a1:h500的区域里就行了 注意sheet1!a表示你原来数据的工作表名为sheet1, 数据在a列,不是的话相应改一下。 在excel中如何有规律的将列变行 比如 1 2 3 4 5 6 7 8 9 相隔处为空白行 变成 123

456 789 请大虾帮忙哈!!!数据非常多,如果用复制转置的话真要命1!谢谢!!问题补充: 若连接处的空行不好处理,能将连续的数列按规律变行更好! 比如 1 2 3 4 5 6 变成 123 456 先万分感谢!! abcdeF 原始数据最终结果行需要合并的单元格 11232a2a3a4 24566a6a7a8

数据库_经典SQL语句大全

一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….)删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1

Oracle列转行和行转列的几种用法

Oracle列转行和行转列的几种用法 栏到 栏主要讨论sys_connect_by_path的用法 1,具有分层关系 SQL > createtabledept(deptnononumber,deptname varchar2 (20),mgrnononumber); table created . SQL >插入deptvalues (1,“总部”,空); 1 row created . SQL >插入deptvalues (2,’浙江分公司’,1); 1 row created . SQL > insert into dept values(3,’杭州分公司’,2);已创建 1行。 SQL >提交; 提交完成。 SQL >从部门连接中选择最大值(子串(sys_connect_by_path(deptname,’,’),2))由先前部门连接= mgrno 最大值(SUBSTER(SYS _ CONNECT _ BY _ PATH(DEPTNAME),’),2) -总部,浙江分行,杭州分行 2,行-列转换 如果一个表的所有列都连接到一行,用逗号分隔:

SQL >选择最大值(SUBSTER(SYS _ CONNECT _ BY _ PATH(column _ name,’,’),2)) MAX(SUBSTRA(SYS _ CONNECT _ BY _ PATH(COLUMN _ NAME,’,’),2)) - DEPTNO,DEPTNAME,MGRNO 3,ListAgg(Oracle 11g) SQL >选择DEPTNO, 2 ListAgg(NAME,’;’) 3在组 4内(由搪瓷订购)搪瓷 5来自emp 6组由deptno 7由deptno 8 / DEPTNO搪瓷 - - 10 CLARK。国王;米勒 20亚当斯;福特。琼斯; SCOTT。史密斯 30艾伦;布莱克; JAMES;马丁; TURNER;下面的W ARD

EXCEL中的表格,行变列,列变行

如何让其行变列,列变行。并且其相关数据也能自动调整 1、启动Excel,打开需要的工作簿,在当前工作表中,选中需要进行行列转换的单元格区域,如A1:X6。 2、单击“编辑”菜单中的“复制”命令。 3、单击要存放转置表区域的左上角单元格,如A7。 4、单击“编辑”菜单中的“选择性粘贴”命令,系统“选择性粘贴”对话框,选中“转置”复选框。 5、单击[确定]按钮,则行列转置后的表格出现在A7:F30单元格区域。现在把A1:X6单元格区域删除,则完成了表格的行列转置。 怎样把WORD、EXCEL中的表格,行变列,列变行? 在EXCEL中是可以做到的,你将要转变的数据区域复制,在目标单元格处右击,选择“选择性粘贴”,将里面的“转置”选中,确定即可。 EXCEL如何有规律列变行? 我有份EXCEL表有一列名字共4000个,我想转换成每行8个名字,共500行.请问有没有什么简单的方法.请高手帮忙. 在这个工作表后面新建一个工作表 A1=INDIRECT("Sheet1!A"&((ROW(A1)-1)*8+COLUMN(A1))) 然后复制到A1:H500的区域里就行了 注意sheet1!A表示你原来数据的工作表名为sheet1,数据在A列,不是的话相应改一下。 在EXCEL中如何有规律的将列变行? 比如 1 2 3 4 5 6 7

8 9 相隔处为空白行 变成 123 456 789 请大虾帮忙哈!!! 数据非常多,如果用复制转置的话真要命1!谢谢!! 问题补充: 若连接处的空行不好处理,能将连续的数列按规律变行更好! 比如 1 2 3 4 5 6 变成 123 456 先万分感谢!! A B C D E F 原始数据最终结果行需要合并的单元格 1 123 2 A2 A 3 A4 2 456 6 A6 A7 A8 3 789 10 A10 A11 A12 101112 14 A14 A15 A16 4 13141 5 18 A18 A19 A20 5 161718 22 A22 A23 A24 6 192021 26 A26 A2 7 A28 30 A30 A31 A32 7 34 A34 A35 A36 8 38 A38 A39 A40 9 42 A42 A43 A44 46 A46 A47 A48 10 50 A50 A51 A52 11 54 A54 A55 A56 12 58 A58 A59 A60 62 A62 A63 A64

word表格行列互换

竭诚为您提供优质文档/双击可除 word表格行列互换 篇一:巧在woRd表格中行列轻松对调 巧在woRd表格中行列轻松对调 在日常工作中,我们经常会遇到将word表格行列对调的情况,但这个看似简单的要求在word中却很难实现,因为word本身并不提供这样的功能。不过,要解决这个难题也不是没有办法,今天笔者就给大家介绍一个利用excel轻松互换word表格的小技巧,希望对大家能有所帮助。 【注】本文所述技巧已于word20xx+excel20xx环境下测试通过 1.打开word软件,选中需要进行行列对调的表格,右击执行“复制”命令 2.再打开excel软件,新建一个工作簿,用鼠标在空白单元格处右击并选择“粘贴”命令 3.在excel软件中,将刚刚粘贴下来的表格再次选中,同样是右击执行“复制”命令 4.在空白单元格处再次右击并执行“选择性粘贴”命令,同时勾选上“转置”复选框后点击“确定”按钮

5.此时,表格中的行列内容已经互换,将完成后的excel 表格选中,并粘贴到word中,基本操作即告完成 6.最后,别忘了删除掉word中的原有表格。至此,所有工作正式完成 篇二:word表格中数据纵横转换的方法和技巧 word表格中数据纵横转换的方法和技巧在实际工作中,有时需要将表格中的行、列数据互换,有时需要将表格数据快速转换成指定列数的新表格,或者对表格作简单编辑后快速得到新表格,这些都是表格内数据纵横转换问题,如何实现呢? 一、实现表格内行列数据互换 对表格的行列数据做转置处理,就能实现表格内行列数据互换。在word中做转置处理困难,但在excel中实现数据转置比较容易。所以,可借助excel实现word表格内行列数据互换。具体操作步骤是:第1步:在word编辑环境下,选定欲操作的表格,执行剪切操作,将表格数据粘贴到剪贴板。第2步:启动excel,执行粘贴操作,将剪贴板内的数据粘贴到当前数据表中;然后,选中全部粘贴来的数据,执行复制操作,并用鼠标单击数据区外的某一单元格,执行“粘贴|转置”命令,得到转置后的数据;(word表格行列互换)再选中转置后的数据,执行复制操作。 第3步:切换到word编辑中,执行“选择性粘贴”命

最新常用经典SQL语句大全完整版

常用经典SQL语句大全完整版--详解+实例下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的device USE master EXEC sp_addumpdevice ’disk’, ’testBack’, ’c:\mssql7backup\MyNwind_1.dat’--- 开始备份 BACKUP DATABASE pubs TO testBack

4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明: 删除新表:drop table tabname 6、说明: 增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明: 添加主键:Alter table tabname add primary key(col) 说明: 删除主键:Alter table tabname drop primary key(col) 8、说明: 创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname

sqlserver到oracle数据无损迁移

sqlserver到oracle数据无损迁移 编者:liuli10@https://www.360docs.net/doc/3f10253879.html, 版本:V1.7 最后修订日期:2015-11-21

第一章简介 1.1数据迁移 随着时代发展数据越来越被重视,而很多时候,当系统需要更新换代的时候,升级后系统所是有的数据库与当前系统的数据库并不一致,此时不仅需要数据割接,最重要的是:如何能将老系统中的数据无损的割接到新系统、新数据库中。因此,结合项目实战经验,针对从windows平台下数据库sqlserver到linux平台下oracle数据库的数据无损迁移进行总结。 1.2数据库简介 一般此处会有很多数据库以及出品公司的历史以及发展历程,在编者看来然而并没有什么大用途,百度百科都可以搜索的到,因此本章结束,直接进入实战总结环节。

第二章sqlserver数据导出 2.1sqlserver数据导出命令 当然不可否认windows为sqlserver提供了强大的图形化平台,导出数据变得只需要点一点就能完成,然而这样的数据导出对于大批量有要求的操作,是极其劳神伤财的,因此,必须要通过命令行进行格式化导出,因此,这里介绍sqlserver 本机数据库导出命令。 2.1.1bcp命令以及参数介绍 https://www.360docs.net/doc/3f10253879.html,/liyanmingkong/article/details/6087674 https://www.360docs.net/doc/3f10253879.html,/uid-25472509-id-4304562.html https://www.360docs.net/doc/3f10253879.html,/link?url=WV2JJM4JHxR7Qct8rr_-499zPc3aP_7E5rOt5l yEnG_Mj_tE9_-ZN1JPE2Vc2wRpkO8QkNGNLVznDfMgniCOnxXhK5jQppNpZk8 Jo1x8o23 为了将文档尽可能精简,bcp命令的参数以及介绍请自行去以上任意网址查询。或者自行baidu或者google搜索。 2.2实战语句解析 实战语句为: bcp"select*from gwbnboss.dbo.ACCOUNT_BUSINESS"queryout "C:\Users\liuli9\Desktop\sqlserverdata_mov\textfile\ACCOUNT_BUSINESS.txt"-c -r"{#$&}"-t"{@#$}"-S"127.0.0.1"-U"数据库用户名"-P"密码" 最终导出的结果存在于 C:\Users\liuli9\Desktop\sqlserverdata_mov\textfile\ACCOUNT_BUSINESS.txt 文件中,当出现“{#$&}”时表示接下来是下一行数据,出现“{@#$}”时表示接下来是下一列数据。将查询结果集完整导出,不对数据做任何格式化或者修改操作,保证数据的原生无损。

常用经典SQL语句大全完整版教学文案

常用经典S Q L语句大 全完整版

常用经典SQL语句大全完整版--详解+实例下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice ’disk’, ’testBack’, ’c:\mssql7backup\MyNwind_1.dat’--- 开始备份

BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明: 删除新表:drop table tabname 6、说明: 增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明: 添加主键:Alter table tabname add primary key(col) 说明: 删除主键:Alter table tabname drop primary key(col) 8、说明: 创建索引:create [unique] index idxname on tabname(col….)

oracle列转行sql详细讲解

--当期时间贷款时间 SELECT DK_ID, max(substr(activeDate, 2)) activeDate FROM (SELECT DK_ID, sys_connect_by_path(activeDate, ',') activeDate FROM (SELECT DK_ID, activeDate, DK_ID || rn rchild, DK_ID || (rn - 1) rfather FROM (SELECT TEMP.DK_ID, --查询项目所在地树形结构全名 SELECT t.area_id, substr(sys_connect_by_path(t.area_name, '-'), 2) as allname , connect_by_root t.area_name as root, --是单一操作符,返回当前层的最顶层节点connect_by_isleaf as IsLeaf, --是伪列,判断当前层是否为叶子节点,1代表是,0代表否 level as lel --是伪列,显示当前节点层所处的层数 FROM dk_project_area_info t START WITH t.area_name = '项目所在地' CONNECT BY PRIOR t.area_id = t.area_pid SYS_CONNECT_BY_PATH 学习2008-09-08 10:59SELECT ename FROM scott.emp START WITH ename = 'KING' CONNECT BY PRIOR empno = mgr; 得到结果为:KING JONES SCOTT ADAMS FORD SMITH BLAKE ALLEN WARD MARTIN TURNER JAMES

oracle 行转列sql

表结构和数据如下(表名Test): NO V ALUE NAME 1 a 测试1 1 b 测试2 1 c 测试3 1 d 测试4 2 e 测试5 4 f 测试6 4 g 测试7 Sql语句: select No, ltrim(max(sys_connect_by_path(Value, ';')), ';') as Value, ltrim(max(sys_connect_by_path(Name, ';')), ';') as Name from (select No, Value, Name, rnFirst, lead(rnFirst) over(partition by No order by rnFirst) rnNext from (select a.No, a.Value, https://www.360docs.net/doc/3f10253879.html,, row_number() over(order by a.No, a.V alue desc) rnFirst from Test a) tmpTable1) tmpTable2 start with rnNext is null connect by rnNext = prior rnFirst group by No; 检索结果如下: NO V ALUE NAME 1 a;b;c;d 测试1;测试2;测试3;测试4 2 e 测试5 4 f;g 测试6;测试7 简单解释一下那个Sql吧: 1、最内层的Sql(即表tmpTable1),按No和Value排序,并列出行号:select a.No, a.Value, https://www.360docs.net/doc/3f10253879.html,, row_number() over(order by a.No, a.V alue desc) rnFirst

动态行列转换(列数不固定)

众所周知,静态SQL的输出结构必须也是静态的。对于经典的行转列问题,如果行数不定导致输出的列数不定,标准的答案就是使用动态SQL, 到11G里面则有XML结果的PIVOT。 今天在asktom看到的一篇贴子彻底颠覆了我的看法!贴子里的链接指向另一个牛人辈出的荷兰公司: http://technology.amis.nl/2006/0 ... ing-antons-thunder/ 还记得Anton Scheffer吗?这位神人先是用10G的MODEL写了SUDOKU的一句SQL的解法,在11GR2推出之后又率先用递归WITH写了个只有短短几行的SUDOKU解法。他的作品还有EXCEL文件生成器。 早在2006年他就发明了真正动态的行转列办法,用的是一系列神秘的函数,如同自定义聚合函数STRAGG里面用的那些。这个神秘的对象代码如下: 1.CREATE OR REPLACE 2.type PivotImpl as object 3.( 4.ret_type anytype,-- The return type of the table function 5.stmt varchar2(32767), 6.fmt varchar2(32767), 7.cur integer, 8.static function ODCITableDescribe( rtype out anytype, p_stmt in varchar2, p_fmt in varchar2 := 'upper(@p@)', dummy in number := 0 ) 9.return number, 10.static function ODCITablePrepare( sctx out PivotImpl, ti in sys.ODCITabFuncInfo, p_stmt in varchar2, p_fmt in varchar2 := 'upper(@p@)', dummy in number := 0 ) 11.return number, 12.static function ODCITableStart( sctx in out PivotImpl, p_stmt in varchar2, p_fmt in varchar2 := 'upper(@p@)', dummy in number := 0 ) 13.return number, 14.member function ODCITableFetch( self in out PivotImpl, nrows in number, outset out anydataset ) 15.return number, 16.member function ODCITableClose( self in PivotImpl ) 17.return number 18.) 19./ 20. 21.create or replace type body PivotImpl as 22.static function ODCITableDescribe( rtype out anytype, p_stmt in varchar2, p_fmt in varchar2 := 'upper(@p@)', dummy in number ) 23.return number 24.is 25.atyp anytype; 26.cur integer; 27.numcols number; 28.desc_tab dbms_sql.desc_tab2; 29.rc sys_refcursor; 30.t_c2 varchar2(32767); 31.t_fmt varchar2(1000); 32.begin 33.cur := dbms_sql.open_cursor; 34.dbms_sql.parse( cur, p_stmt, dbms_sql.native ); 35.dbms_sql.describe_columns2( cur, numcols, desc_tab ); 36.dbms_sql.close_cursor( cur ); 37.-- 38.anytype.begincreate( dbms_types.typecode_object, atyp ); 39.for i in 1 .. numcols - 2

ORACLE关于动态SQL的使用

关于动态SQL的使用-----摘录 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows2000Professional(英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明: 一、本地动态SQL 本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。 1、本地动态SQL执行DDL语句: 需求:根据用户输入的表名及字段名等参数动态建表。 create or replace procedure proc_test ( table_name in varchar2,--表名 field1in varchar2,--字段名 datatype1in varchar2,--字段类型 field2in varchar2,--字段名 datatype2in varchar2--字段类型 )as str_sql varchar2(500); begin str_sql:=create table||table_name||(||field1||||datatype1||,||field2|| ||datatype2||); execute immediate str_sql;--动态执行DDL语句 exception when others then null; end; 以上是编译通过的存储过程代码。下面执行存储过程动态建表。

数据库经典SQL语句大全

数据库经典SQL语句大全 篇一:经典SQL语句大全 下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk','testBack', 'c:mssql7backupMyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2? from tab_old definition only 5、说明: 删除新表: tabname 6、说明: 增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明: 添加主键:Alter table tabname add primary key(col) 说明: 删除主键:Alter table tabname drop primary key(col) 8、说明: 创建索引:create [unique] index idxname on tabname(col?.) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。

Oracle行转列,列转行

先来个简单的用法 列转行 Create table test (name char(10),km char(10),cj int) insert test values('张三','语文',80) insert test values('张三','数学',86) insert test values('张三','英语',75) insert test values('李四','语文',78) insert test values('李四','数学',85) insert test values('李四','英语',78) select name, sum(decode(km,'语文',CJ,0)) 语文, sum(decode(km,'数学',cj,0)) 数学, sum(decode(km,'英语',cj,0)) 英语 from test1 group by name 姓名语文数学英语 张三80 86 75 李四78 85 78 行转列 with x as( selectname, sum(decode(km,'语文',CJ,0)) 语文 , sum(decode(km,'数学',cj,0)) 数学, sum(decode(km,'英语',cj,0)) 英语 fromtest groupbyname) selectname,decode(rn,1, '语文', 2, '数学', 3,'英语') 课程, decode(rn, 1, 语文, 2, 数学, 3,英语) 分数 from x, (selectlevel rn from dual connectby1=1andlevel<=3) (from 后面接两个表,是笛卡尔积)

sqlserver行列转换

SQL Server中行列转换Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE 语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN() ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现 完整语法: table_source UNPIVOT( value_column FOR pivot_column IN() )

注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别在数据库属性->选项->兼容级别改为 90 典型实例 一、行转列 1、建立表格 if object_id('tb')isnotnull droptable tb go createtable tb(姓名varchar(10),课程varchar(10),分数int) insertinto tb values('张三','语文',74) insertinto tb values('张三','数学',83) insertinto tb values('张三','物理',93) insertinto tb values('李四','语文',74) insertinto tb values('李四','数学',84) insertinto tb values('李四','物理',94) go select*from tb go 姓名课程分数 ---------- ---------- ----------- 张三语文 74

精妙SQL语句收集

精妙SQL语句收集 摘要:一、基础 二、提升 三、技巧 正文: SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 一、基础 1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2... from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加var char类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col)

SqlServer普通行列转换

/* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。 问题:假设有张学生成绩表(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 SERVER 2005 静态SQL。

50个经典sql语句总结

一个项目涉及到的50个Sql语句(整理版) --1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表 Course(C,Cname,T) --C --课程编号,Cname 课程名称,T 教师编号 --3.教师表 Teacher(T,Tname) --T 教师编号,Tname 教师姓名 --4.成绩表 SC(S,C,score) --S 学生编号,C 课程编号,score 分数 */ --创建测试数据 create table Student(S varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10)) insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男') insert into Student values('02' , N'钱电' , '1990-12-21' , N'男') insert into Student values('03' , N'孙风' , '1990-05-20' , N'男') insert into Student values('04' , N'李云' , '1990-08-06' , N'男') insert into Student values('05' , N'周梅' , '1991-12-01' , N'女') insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女') insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女') insert into Student values('08' , N'王菊' , '1990-01-20' , N'女') create table Course(C varchar(10),Cname nvarchar(10),T varchar(10)) insert into Course values('01' , N'语文' , '02') insert into Course values('02' , N'数学' , '01') insert into Course values('03' , N'英语' , '03') create table Teacher(T varchar(10),Tname nvarchar(10)) insert into Teacher values('01' , N'张三') insert into Teacher values('02' , N'李四') insert into Teacher values('03' , N'王五') create table SC(S varchar(10),C varchar(10),score decimal(18,1)) insert into SC values('01' , '01' , 80) insert into SC values('01' , '02' , 90) insert into SC values('01' , '03' , 99) insert into SC values('02' , '01' , 70) insert into SC values('02' , '02' , 60) insert into SC values('02' , '03' , 80) insert into SC values('03' , '01' , 80) insert into SC values('03' , '02' , 80) insert into SC values('03' , '03' , 80) insert into SC values('04' , '01' , 50) insert into SC values('04' , '02' , 30) insert into SC values('04' , '03' , 20) insert into SC values('05' , '01' , 76) insert into SC values('05' , '02' , 87)

相关文档
最新文档