爱飞 发表于 2015-1-16 22:28:41

MSSQL网站制作之行列转换 交织表

用一个库#bak_database存放这些历史数据。转换
总结了一些有代表性的贴子,详细见http://expert.csdn.net/Expert/topic/2440/2440306.xml?temp=.6941645

1:列转为行:
eg1:
Createtabletest(namechar(10),kmchar(10),cjint)
go
inserttestvalues(张三,语文,80)
inserttestvalues(张三,数学,86)
inserttestvalues(张三,英语,75)
inserttestvalues(李四,语文,78)
inserttestvalues(李四,数学,85)
inserttestvalues(李四,英语,78)

想酿成

姓名语文数学英语
张三808675
李四788578


declare@sqlvarchar(8000)
set@sql=selectname
select@sql=@sql+,sum(casekmwhen+km+thencjend)[+km+]
from(selectdistinctkmfromtest)asa
select@sql=@sql+fromtestgroupbyname
exec(@sql)

droptabletest



eg2:
有表A,
idpid
11
12
13
21
22
31
怎样化成表B:
idpid
11,2,3
21,2
31
大概是从表B酿成A(不要用游标)
之前有类似的列子,如今找不到了,帮协助!


--1.创立一个兼并的函数
createfunctionfmerg(@idint)
returnsvarchar(8000)
as
begin
declare@strvarchar(8000)
set@str=
select@str=@str+,+cast(pidasvarchar)from表Awhereid=@id
set@str=right(@str,len(@str)-1)
return(@str)
End
go

--挪用自界说函数失掉了局
selectdistinctid,dbo.fmerg(id)from表A


2:
/***********行转列*****************/
测试:
createtablet1(aint,bint,cint,dint,eint,fint,gint,hint)
insertt1values(15,9,1,0,1,2,2,0)

declare@varchar(8000)
set@=
select@=@+rtrim(name)+fromt1unionallselectfromsyscolumnswhereid=object_id(t1)
set@=left(@,len(@)-len(fromt1unionallselect))
--print@
exec(select+@+fromt1)

a
-----------
15
9
1
0
1
2
2
0


支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

飘灵儿 发表于 2015-1-19 14:01:50

无法深入到数据库系统层面去了解和探究

乐观 发表于 2015-1-26 05:13:16

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

柔情似水 发表于 2015-2-4 13:27:07

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

谁可相欹 发表于 2015-2-9 23:45:25

作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!

简单生活 发表于 2015-2-28 08:50:28

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

灵魂腐蚀 发表于 2015-3-17 02:08:57

现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.

再现理想 发表于 2015-3-23 17:00:17

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
页: [1]
查看完整版本: MSSQL网站制作之行列转换 交织表