读书人

[原创] 按任意的字段旋转的存储过程 :

发布时间: 2012-02-25 10:01:47 作者: rapoo

[原创] 按任意的字段旋转的存储过程 :)

----------------------------------------
-- 分段截取函数
----------------------------------------
CREATE FUNCTION DBO.FUN_SplitStr(
@S VARCHAR(8000), -- 包含多个数据项的字符串
@POS INT, -- 要获取的数据项的位置
@SPLIT VARCHAR(10) -- 数据分隔符
) RETURNS VARCHAR(128)
AS
BEGIN
IF @S IS NULL RETURN(NULL)
DECLARE @SPLITLEN INT
SELECT @SPLITLEN=LEN(@SPLIT+'A')-2
WHILE @POS>1 AND CHARINDEX(@SPLIT,@S+@SPLIT)>0 BEGIN
SELECT @POS=@POS-1,
@S=STUFF(@S,1,CHARINDEX(@SPLIT,@S+@SPLIT)+@SPLITLEN,'')
END
RETURN LEFT(@S,CHARINDEX(@SPLIT,@S+@SPLIT)-1)
END

GO
-------------------------------------------
--行列转换
-------------------------------------------
CREATE PROC PRC_CORSSQUERY
@NVR_TABNAMEAS NVARCHAR(1024) = '',-- 此处放表名
@NVR_XCOLAS NVARCHAR(1024) = '',-- 表头分组依据字段 (横向字段,以系统编号作为依据,内部转化,此字段只能有一个)
@NVR_YCOLAS NVARCHAR(1024) = '',-- 分组字段 (纵向字段,直接取名称列,可以有多个,多个用逗号分隔)
@NVR_STATCOLAS NVARCHAR(1024) = '',-- 被统计的字段 (值)
@NVR_WHEREAS NVARCHAR(4000)='',-- WHERE条件 (一定要带 WHERE 语句,如:WHERE 地区=''广州'' ) * 注意字符一定要用两个分号.
@NVR_TOTALAS NVARCHAR(1024)='',-- 合计的公式( SUM,AVG ,将其放在第一列.如果多项,请用逗号分隔)
@NVR_ORDERBYAS NVARCHAR(1024)='' -- 排序字段,如: [海关编码],[地区]
AS BEGIN

--SET NOCOUNT ON

DECLARE @NVR_CMD AS NVARCHAR(4000)
DECLARE @NVR_XCOLNAMEAS NVARCHAR(256)

DECLARE @NVR_SQL0 AS NVARCHAR(4000)
DECLARE @NVR_SQL1 AS NVARCHAR(4000)
DECLARE @NVR_SQL2 AS NVARCHAR(4000)
DECLARE @NVR_SQL3 AS NVARCHAR(4000)
DECLARE @NVR_SQL4 AS NVARCHAR(4000)
DECLARE @NVR_SQL5 AS NVARCHAR(4000)
DECLARE @NVR_SQL6 AS NVARCHAR(4000)
DECLARE @NVR_SQL7 AS NVARCHAR(4000)
DECLARE @NVR_SQL8 AS NVARCHAR(4000)
DECLARE @NVR_SQL9 AS NVARCHAR(4000)
DECLARE @NVR_SQL10 AS NVARCHAR(4000)
DECLARE @NVR_SQL11 AS NVARCHAR(4000)
DECLARE @NVR_SQL12 AS NVARCHAR(4000)
DECLARE @NVR_SQL13 AS NVARCHAR(4000)
DECLARE @NVR_SQL14 AS NVARCHAR(4000)
DECLARE @NVR_SQL15 AS NVARCHAR(4000)
DECLARE @NVR_SQL16 AS NVARCHAR(4000)
DECLARE @NVR_SQL17 AS NVARCHAR(4000)
DECLARE @NVR_SQL18 AS NVARCHAR(4000)
DECLARE @NVR_SQL19 AS NVARCHAR(4000)
DECLARE @NVR_SQL20 AS NVARCHAR(4000)

DECLARE @NVR_DATETYPE AS NVARCHAR(1)
DECLARE @INT_ID AS INT
DECLARE @NVR_GOODSUNITAS NVARCHAR(32)
DECLARE @INT_UNITINT
-----------------------------------------

SELECT @NVR_SQL0='',@INT_ID=0,@NVR_SQL0='',@NVR_SQL1='',@NVR_SQL2='',@NVR_SQL3='',@NVR_SQL4='',@NVR_SQL5='',@NVR_SQL6='',@NVR_SQL7='',@NVR_SQL8='',@NVR_SQL9='',
@NVR_SQL10='',@NVR_SQL11='',@NVR_SQL12='',@NVR_SQL13='',@NVR_SQL14='',@NVR_SQL15='',@NVR_SQL16='',@NVR_SQL17='',@NVR_SQL18='',@NVR_SQL19='',@NVR_SQL20=''

DECLARE @INT_I INT
DECLARE @NVR_FLDNAME NVARCHAR(128)
SET @INT_I=0
WHILE (1=1) BEGIN
SET @INT_I=@INT_I+1
SELECT @NVR_FLDNAME= DBO.FUN_SplitStr(@NVR_YCOL,@INT_I,',')-- 以逗号为分隔
SET @NVR_FLDNAME=LTRIM(RTRIM(ISNULL(@NVR_FLDNAME,'')))
IF @NVR_FLDNAME<>'' BEGIN
SET @NVR_SQL0 =@NVR_SQL0 + @NVR_FLDNAME + ','
END ELSE BEGIN
SET @NVR_SQL0 = ' SELECT ' + LEFT(@NVR_SQL0 ,LEN(@NVR_SQL0)-1)
BREAK -- 结束拆分
END
END


[解决办法]
接分
[解决办法]
SF
[解决办法]
jf
------解决方案--------------------


探讨
jf

[解决办法]
jf
[解决办法]
不知道执行起来速度怎么样
[解决办法]
这个,可以收藏了
[解决办法]
very good!

[解决办法]
学习陈先生的精华!
[解决办法]
jf
[解决办法]
又是一个牛人。
[解决办法]
探讨
学习陈先生的精华!

[解决办法]
支持原创
[解决办法]
严重关注事态发展.
[解决办法]
探讨
严重关注事态发展.

[解决办法]
这么复杂的报表需求,就不要用sql语句了。用MDX语句可以更自由的定义维度和行列的关系,不但速度快而且语法简练
[解决办法]
我以前也有过类似的想法,比如下面的代码
,但是后来发现没有什么太大用处
SQL code
/*范例表create table 表1 (     char(10),     成 integer,     科目 char(10) ) insert into 表1 select '1',60,'数学' union select '1',43,'物理' union select '1',100,'语文' union select '2',87,'语文' union select '2',99,'数学' union select '2',89,'物理' union select '2',87,'语文' */Create procedure RowToColumn  @Table varchar(30),              --表名  @MasterField varchar(30),    --待转名称列名 char字段  @SlaveField varchar(30),    --待转数据列名 int型字段  @GroupID varchar(30)    --分组ID  as--调用方法 RowToColumn '表1','科目','成',''--by jinjazz  环境 SQLServer2000begin  DECLARE @mSQL VARCHAR(8000)    set @msql = 'DECLARE @SQL VARCHAR(8000)'    set @msql = @msql + ' set @SQL= ''select ' + @GroupID + ''''    set @msql = @msql + ' SELECT @SQL= @SQL+'',max(CASE WHEN ' +    @MasterField + '=''''''+' + @MasterField + '+'''''' then  ' + @SlaveField +      ' else 0 end )[''+' + @MasterField + '+'']'' from(select distinct ' +      @MasterField + ' from ' + @Table + ') a'    set @msql = @msql + ' SET @SQL=@SQL+ '' from ' + @Table + ' group by ' +      @GroupID + ''''    set @msql = @msql + ' exec(@SQL)'    exec(@msql)end
[解决办法]
我们把olap部署在公司服务器上,通过应用服务器去数据库仓库请求数据,把返回的ADOMD数据集转化为ADO.Net数据集来共其他bs系统和smartclient系统使用。
[解决办法]
其实SQLserver2005的 Analysis Services部署也没有太大问题。我只在第一次用它的时候花了几天时间。现在如果有一套线程的sql数据库结构和稍微简单点的多维数据集的模型需求。从建模到数据完全处理可能半天时间都不需要。
[解决办法]
因为楼主是我在数据仓库板块浏览帖子中唯一一个有印象的朋友...所以也推断你肯定对ssas比较熟悉,才会用mdx和sql来做比较,以后说不定有问题还要请教楼主。
[解决办法]
探讨
严重关注事态发展.

[解决办法]
支持
[解决办法]
探讨
数据量一般有 2亿到5亿之间.

[解决办法]
[size=24px][/size]


[解决办法]
Mark一下,
学习,
缓慢地漂移~
[解决办法]
收藏
[解决办法]
做个记号,
方法值得参考!

[解决办法]
在MSSQL2005以后,使用Pivot/Unpivot +动态SQL语句
很简单的解决这类行/列之间转换问题。

[解决办法]
数据量一般有 2亿到5亿之间.
[解决办法]
强帖,学习.
[解决办法]
感谢楼主提供这么实用的存储过程。
“我们是做产品的,我不可能要求用户全部换成 SQL2005 . 所以,到目前我们还不敢上 2005 .还在 2000 里打混.”,楼主看来是个很实在的人。
[解决办法]
mark
[解决办法]
强帖,从实际中来得来的,经过实践检验过的好东西!

[解决办法]
强帖,支持lz的奉献精神!
[解决办法]
...看见这么长的脚本,头都是痛的,
还是很佩服楼主的专业精神
[解决办法]

[解决办法]
peifu...
[解决办法]
两牛人...
[解决办法]
凶悍啊
[解决办法]

探讨
凶悍啊

[解决办法]
探讨
引用:
凶悍啊

[解决办法]
ZHICHI

读书人网 >SQL Server

热点推荐