金色的骷髅 发表于 2015-1-16 22:15:55

MYSQL编程:sqlserver 行列互转完成小结

甚至一个有经验的Windows管理者也可以轻松部署并开始学习它,而你不需投入一分钱来了解这个数据库。复制代码代码以下:
--行列互转
/******************************************************************************************************************************************************
以先生成就为例子,对照抽象易懂

收拾人:中国风(Roy)

日期:2008.06.06
******************************************************************************************************************************************************/

--1、行互列
-->-->(Roy)天生y

ifnotobject_id(Class)isnull
droptableClass
Go
CreatetableClass(nvarchar(2),nvarchar(2),int)
InsertClass
selectN张三,N语文,78unionall
selectN张三,N数学,87unionall
selectN张三,N英语,82unionall
selectN张三,N物理,90unionall
selectN李四,N语文,65unionall
selectN李四,N数学,77unionall
selectN李四,N英语,65unionall
selectN李四,N物理,85
Go
--2000办法:
静态:

declare@snvarchar(4000)
set@s=
Select@s=@s+,+quotename()+=max(casewhen=+quotename(,)+thenelse0end)
fromClassgroupby
exec(select+@s+fromClassgroupby)


天生静态:

select
,
[数学]=max(casewhen=数学thenelse0end),
[物理]=max(casewhen=物理thenelse0end),
[英语]=max(casewhen=英语thenelse0end),
[语文]=max(casewhen=语文thenelse0end)
from
Class
groupby

GO
静态:

declare@snvarchar(4000)
Select@s=isnull(@s+,,)+quotename()fromClassgroupby
exec(select*fromClasspivot(max()forin(+@s+))b)

天生静态:
select*
from
Class
pivot
(max()forin([数学],[物理],[英语],[语文]))b

天生格局:
/*
Student数学物理英语语文
---------------------------------------------------
李四77856565
张三87908278

(2行受影响)
*/

------------------------------------------------------------------------------------------
go
--加上总成就(学科均匀分)

--2000办法:
静态:

declare@snvarchar(4000)
set@s=
Select@s=@s+,+quotename()+=max(casewhen=+quotename(,)+thenelse0end)
fromClassgroupby
exec(select+@s+,[总成就]=sum()fromClassgroupby)--加多一列(学科均匀分用avg())

天生静态:

select
,
[数学]=max(casewhen=数学thenelse0end),
[物理]=max(casewhen=物理thenelse0end),
[英语]=max(casewhen=英语thenelse0end),
[语文]=max(casewhen=语文thenelse0end),
[总成就]=sum()--加多一列(学科均匀分用avg())
from
Class
groupby

go

--2005办法:

静态:

declare@snvarchar(4000)
Select@s=isnull(@s+,,)+quotename()fromClassgroupby--isnull(@s+,,)往失落字符串@s中第一个逗号
exec(select,+@s+,[总成就]from(select*,[总成就]=sum()over(partitionby)fromClass)a
pivot(max()forin(+@s+))b)

天生静态:

select
,[数学],[物理],[英语],[语文],[总成就]
from
(select*,[总成就]=sum()over(partitionby)fromClass)a--均匀分时用avg()
pivot
(max()forin([数学],[物理],[英语],[语文]))b

天生格局:

/*
Student数学物理英语语文总成就
--------------------------------------------------------------
李四77856565292
张三87908278337

(2行受影响)
*/

go

--2、列转行
-->-->(Roy)天生y

ifnotobject_id(Class)isnull
droptableClass
Go
CreatetableClass(nvarchar(2),[数学]int,[物理]int,[英语]int,[语文]int)
InsertClass
selectN李四,77,85,65,65unionall
selectN张三,87,90,82,78
Go

--2000:

静态:

declare@snvarchar(4000)
select@s=isnull(@s+unionall,)+select,=+quotename(Name,)--isnull(@s+unionall,)往失落字符串@s中第一个unionall
+,=+quotename(Name)+fromClass
fromsyscolumnswhereID=object_id(Class)andNamenotin(Student)--扫除不转换的列
orderbyColid
exec(select*from(+@s+)torderby,)--增添一个排序

天生静态:
select*
from(select,=数学,=[数学]fromClassunionall
select,=物理,=[物理]fromClassunionall
select,=英语,=[英语]fromClassunionall
select,=语文,=[语文]fromClass)t
orderby,

go
--2005:

静态:

declare@snvarchar(4000)
select@s=isnull(@s+,,)+quotename(Name)
fromsyscolumnswhereID=object_id(Class)andNamenotin(Student)
orderbyColid
exec(selectStudent,,fromClassunpivot(forin(+@s+))b)

go
select
Student,,
from
Class
unpivot
(forin([数学],[物理],[英语],[语文]))b

天生格局:
/*
StudentCourseScore
-------------------------
李四数学77
李四物理85
李四英语65
李四语文65
张三数学87
张三物理90
张三英语82
张三语文78

(8行受影响)
*/

使用DBaaS能让收入损失从其他业务上得到弥补,如软件更新和硬件管理。也许决定走DBaaS之路的客户可能会跳过解决方案提供商,尽管这个决策看起来有点短视。

莫相离 发表于 2015-1-19 06:26:15

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

飘灵儿 发表于 2015-1-25 23:31:42

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

冷月葬花魂 发表于 2015-2-4 13:22:09

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。

深爱那片海 发表于 2015-2-28 08:48:48

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

简单生活 发表于 2015-3-9 21:53:32

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

飘飘悠悠 发表于 2015-3-17 02:08:58

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

小妖女 发表于 2015-3-23 17:02:41

这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
页: [1]
查看完整版本: MYSQL编程:sqlserver 行列互转完成小结