交叉表
交叉表 交叉表 CREATE PROCEDURE prCrosstab @chrRowHead char(30),/*表示列,在交叉表的结果中作为第一列出现*/ @chrColHead char(30),/*表示列,在交叉表的结果中该列中的数据被变换为新列名称*/ @chrvalue char(30),/*表示列,在该列中执行聚合函数*/ @ch
交叉表 交叉表CREATE PROCEDURE prCrosstab @chrRowHead char(30),/*表示列,在交叉表的结果中作为第一列出现*/ @chrColHead char(30),/*表示列,在交叉表的结果中该列中的数据被变换为新列名称*/ @chrvalue char(30),/*表示列,在该列中执行聚合函数*/ @chrSource char(30),/*源表或视图*/ @inyType tinyint=1,/*1-求和,2-平均值,3-最小值,4-最大值,5-计数*/ @inyGrouping tinyint=0/*1-工作日,2-年内的周数,3-月份,4-季度,5-年份*/ AS /*过程变量*/ Declare @chvRow varchar(255), @chvCol varchar(255), @chvVal varchar(255), @chvType varchar(10), @chvRowType varchar(10), @chvColType varchar(255), @chvTemp varchar(255), @chvColTemp varchar(255), @chvRowTemp varchar(255), @intType int, @intRowType int, @intColType int, @chvExec varchar(255), @chvGroup varchar(255), @fltTemp float, @dtmTemp Datetime, @insR smallint, @intColumn int, @intReturn int, @intTemp int, @intColNameLen int, @intMaxRowHead int Set NoCount On /*检查数据源是否存在*/ if not Exists (select * From sysobjects where name=@chrSource and type in('v','u')) Begin Raiserror 51001 '数据源不存在' Return -1 End /*检查列是否存在*/ if not Exists (select sc.name from syscolumns sc join sysobjects so on sc.id=so.id where so.name=@chrSource and sc.name=@chrColHead) Begin Raiserror 51002 '无效 @chrColHead 名称' Return -1 End if not Exists (select sc.name from syscolumns sc join sysobjects so on sc.id=so.id where so.name=@chrSource and sc.name=@chrRowHead) Begin Raiserror 51002 '无效 @chrRowHead名称' Return -1 End if not Exists (select sc.name from syscolumns sc join sysobjects so on sc.id=so.id where so.name=@chrSource and sc.name=@chrvalue) Begin Raiserror 51002 '无效 @chrvalue 名称' Return -1 End /*检查聚合函数类型,是否是有效值*/ if @inyType<1 or @inyType>5 Begin Raiserror 51000 '无效聚合函数类型' Return -1 End /*确定聚合函数类型*/ Select @chvType= Case @inyType when 1 then 'SUM' when 2 then 'AVG' when 3 then 'MAX' when 4 then 'MIN' when 5 then 'COUNT' else 'SUM' End /*取得@chrvalue的数据类型*/ Select @chvTemp=t2.name From sysobjects o join syscolumns c on (o.id=c.id) join systypes t1 on (t1.usertype=c.usertype) join systypes t2 on (t1.type=t2.type) where t2.usertype<100 and t2.usertype<>18 and t2.usertype<>80 and o.type in ('u','v') and o.name=@chrSource and c.name=@chrvalue /*数据类型分类*/ Select @intTemp= Case when @chvTemp in ('int','smallint','tinyint','float','real','decimal','numeric','money','smallmoney') then 1 when @chvTemp in ('datetime','smalldatetime') then 3 when @chvTemp in ('bit','char','varchar') then 5 else 100 End /*检查数据类型与聚合类型是否匹配*/ if @inyType<@intTemp Begin Raiserror 51020 '无效的数据类型 @chrvalue' Return -1 End /*转换成合适的数据类型*/ Select @chvColType=Rtrim( Case @inyType when 5 then 'int' else case when @chvTemp in ('bit','char','varchar ') then 'int' when @chvTemp in ('decimal','numeric') then 'float' else @chvTemp end End) /*确认数据分组是否有效*/ if @inyGrouping<0 or @inyGrouping>5 Begin Raiserror 51010 '无效的数据分组' Return -1 End /*取得@chrColHead列的合法数据类型*/ Select @chvTemp=t2.name From sysobjects o join syscolumns c on (o.id=c.id) join systypes t1 on (t1.usertype=c.usertype) join systypes t2 on (t1.type=t2.type) Where t2.usertype<100 and t2.usertype<>18 and t2.usertype<>80 and o.type in ('u','v') and o.name=@chrSource and c.name=@chrColHead if upper(@chvTemp) not in ('CHAR','VARCHAR') Select @intColType=1 else Select @intColType=0 /*取得@chrRowHead的合法数据类型*/ Select @chvRowType=t2.name From sysobjects o join syscolumns c on (o.id=c.id) join systypes t1 on (t1.usertype=c.usertype) join systypes t2 on (t1.type=t2.type) Where t2.usertype<100 and t2.usertype<>18 and t2.usertype<>80 and o.type in ('u','v') and o.name=@chrSource and c.name=@chrRowHead if upper(@chvRowTemp) not in ('CHAR','VARCHAR') Select @intRowType=1 else Select @intRowType=0 /*检查组分类类型*/ Select @intTemp= Case when @chvTemp in ('int','smallint','tinyint','float','real','decimal','numeric','money','smallmoney') then 1 when @chvTemp in ('datetime','smalldatetime') then 3 when @chvTemp in ('bit','char','varchar') then 5 else 100 End /*验证数据类型与日期分组类型的一致性*/ /*将来可扩充成其他数据类型分组*/ if (@intTemp=5 and @inyGrouping>0) or (@intTemp=1 and @inyGrouping>0) or (@intTemp=3 and @inyGrouping=0) Begin Raiserror 51030 '分组数据与分组类型不一致' Return -1 End /*安全性检查*/ /*此部分以后完成 if user_id()<>1 Begin if (Select Count(distinct c.name) From syscolumns c,sysobjects o,sysprotects p,sysusers u,master..spt_values v Where c.name in (@chrColHead,@chrRowHead,@chrvalue) */ /*定义临时表*/ Create Table #colNames(colname varchar(255),colnumber int Null) Create Table #rownames(rowname varchar(255) null) /*创建colnames表*/ Select @chvExec='insert #colnames select col1,col2 from' +'(select distinct col1='+ case @intTemp when 3 then case when @inyGrouping in (1,3) then 'datename('+ case @inyGrouping when 1 then 'weekday' when 3 then 'month' end +','+RTrim(@chrColHead)+')' else Case @inyGrouping when 2 then '''Week' when 4 then '''quarth' when 5 then '''year' end+'_''+'+'datename('+ case @inyGrouping when 2 then 'week' when 4 then 'quarth' when 5 then'year' end+','+RTrim(@chrColHead)+')' end else case @intColType when 1 then 'convert(varchar(255),'+RTrim(@chrColHead)+')' else RTrim(@chrColHead) end end+',col2='+ case @intTemp when 3 then 'datepart('+ case @inyGrouping when 1 then 'weekday' when 2 then 'week' when 3 then 'month' when 4 then 'quarter' when 5 then 'year' end+','+Rtrim(@chrColHead)+')' else '0' end+',col3='+ case @intTemp when 3 then 'datepart('+ case @inyGrouping when 1 then 'weekday' when 2 then 'week' when 3 then 'month' when 4 then 'quarter' when 5 then 'year' end+','+RTrim(@chrColHead)+')' else RTrim(@chrColHead) end+' from '+RTrim(@chrSource)+')xyz order by col3' --Print @chvExec Exec(@chvExec) --select * from #ColNames /*检查列计数值*/ if (select Count(*) from #colnames)>1023 begin drop table #colnames raiserror 51004 'Distinct column count exceeded max of 1023.' return -1 end /*检验名称长度*/ if (Select max(DataLength(Rtrim(colname))-1) from #colnames)>29 Begin Drop Table #colnames RaisError 51050 'Column data length exceeded max of 30.' Return -1 End /*填写RowNames表*/ Select @chvExec='insert #rownames select distinct '+ Case @intRowtype when 1 then 'convert(varchar255),' else '' end+Rtrim(@chrRowHead)+ Case @intRowType when 1 then ')' else '' End+' from '+@chrSource --Print @chvExec Exec(@chvExec) /*创建和修改crosstable*/ Select @intMaxRowHead= (Select Max(DataLength(RTrim(rowname))) from #rownames) /*创建Crosstable*/ /*定义Crosstable的RowHead字段*/ Create Table #crosstable(Rowhead varchar(255) null) /*在Crosstable中加入列*/ Declare colname_cursor2 cursor for select colname from #colnames open colname_cursor2 Fetch colname_cursor2 into @chvCol while @@fetch_status>=0 Begin Select @chvColTemp='' if @chvCol Like '%[^A-Z0-9]%' Begin Select @insR=1 While @insr<=DataLength(RTrim(@chvCol)) Begin Select @chvColTemp=Rtrim(@chvColtemp)+ Case when substring(@chvCol,@insR,1) Like '[A-Z0-9_]' then substring(@chvCol,@insR,1) Else '' End Select @insR=@insr+1 end Select @chvCol=@chvColTemp End Select @chvExec='alter table #crosstable add '+ Case when substring(@chvCol,1,1) Like '[^1234567890]' then @chvCol else '_'+LTrim(@chvCol) End +' '+@chvColType+' null default (0)' --Print @chvExec Exec(@chvExec) Fetch colname_cursor2 into @chvCol End Close colname_cursor2 Deallocate colname_cursor2 /*加入初始Crosstable数据*/ Select @chvExec='insert #crosstable(rowhead) select rowname from #rownames' --Print @chvExec Exec(@chvExec) /*使用游标填写crosstable的剩余部分*/ /*创建游标*/ Select @chvExec='declare colname_cursor3 cursor for select '+ Case @intRowType when 1 then 'convert(varchar(255),'+RTrim(@chrRowHead)+')' Else RTrim(@chrRowHead) End+','+ Case when @intTemp=3 then case when @inyGrouping in (1,3) then 'Datename('+ case @inyGrouping when 1 then 'weekday' when 3 then 'month' end+','+RTrim(@chrColHead)+')' else case @inyGrouping when 2 then '''Week' when 4 then '''Quarth' when 5 then '''Year' End+'_''+'+'datename('+ case @inyGrouping when 2 then 'week' when 4 then 'quarth' when 5 then 'year' end+','+RTrim(@chrColHead)+')' End Else Case @intColType When 1 then 'convert(varchar(255),'+RTrim(@chrColHead)+')' Else RTrim(@chrColHead) End End+',total=Convert(varchar(255),'+RTrim(@chvType)+'('+RTrim(@chrvalue)+')) from '+ RTrim(@chrSource)+' group by '+RTRim(@chrRowHead)+','+ Case @intTemp when 3 then case when @inyGrouping in (1,3) then 'Datename('+ case @inyGrouping when 1 then 'weekday' when 3 then 'month' end+','+RTrim(@chrColHead)+')' else case @inyGrouping when 2 then '''Week' when 4 then '''Quarth' when 5 then '''Year' end+'_''+'+'datename('+ case @inyGrouping when 2 then 'week' when 4 then 'quarter' when 5 then 'year' end+','+RTrim(@chrColHead)+')' end else Rtrim(@chrColHead) End --Print @chvExec Exec(@chvExec) /*更新Crosstable表*/ Begin Tran Open colname_cursor3 Fetch colname_cursor3 into @chvRow,@chvCol,@chvVal while @@fetch_status>=0 Begin Select @chvColTemp='' if @chvCol Like '%[^A-Z0-9]%' Begin Select @insR=1 While @insR<=DataLength(RTRim(@chvCol)) Begin Select @chvColTemp=RTRim(@chvColTemp)+ Case When Substring(@chvCol,@insR,1) Like '[A-Z0-9_]' then Substring(@chvCol,@insR,1) Else ' ' End Select @insR=@insR+1 End Select @chvCol=@chvColTemp End Select @chvExec='update #crosstable set '+ Case when substring(@chvCol,1,1) Like '[^1234567890]' then @chvCol Else '_'+LTrim(@chvCol) End+'='+ Case when @chvVal is Null then '0' Else RTrim(@chvVal) End+' where Rowhead='''+RTRim(@chvRow) Select @chvRow= Case When @chvRow is Null Then 'NULL' Else RTrim(@chvRow) End Select @chvRowTemp='' if @chvRow Like'%' Begin Select @insR=1 While @insR<=DataLength(RTrim(@chvRowTemp))-1 Begin Select @chvRowTemp=RTrim(@chvRowTemp)+ Case When Substring(@chvRow,@insR,1) Like '[^'']' then Substring(@chvRow,@insR,1) Else ' '' '' ' End Select @insR=@insR+1 End End Select @chvRow=@chvRowTemp Select @chvExec=@chvExec+@chvRow+'''' --Print @chvExec Exec(@chvExec) Fetch colname_cursor3 into @chvRow,@chvCol,@chvVal End Close colname_cursor3 Deallocate colname_cursor3 Commit Tran Set NoCount off Select @chvExec='Select * from #crosstable' --Print @chvExec Exec(@chvExec) Drop Table #colnames Drop Table #rownames Drop Table #crosstable

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 MySQL의 Alter Table 문을 사용하여 열 추가/드롭 테이블/열 변경 및 열 데이터 유형 변경을 포함하여 테이블을 수정하는 것에 대해 설명합니다.

기사는 인증서 생성 및 확인을 포함하여 MySQL에 대한 SSL/TLS 암호화 구성에 대해 설명합니다. 주요 문제는 자체 서명 인증서의 보안 영향을 사용하는 것입니다. [문자 수 : 159]

기사는 MySQL Workbench 및 Phpmyadmin과 같은 인기있는 MySQL GUI 도구에 대해 논의하여 초보자 및 고급 사용자를위한 기능과 적합성을 비교합니다. [159 자].

기사는 MySQL에서 파티셔닝, 샤딩, 인덱싱 및 쿼리 최적화를 포함하여 대규모 데이터 세트를 처리하기위한 전략에 대해 설명합니다.

InnoDB의 전체 텍스트 검색 기능은 매우 강력하여 데이터베이스 쿼리 효율성과 대량의 텍스트 데이터를 처리 할 수있는 능력을 크게 향상시킬 수 있습니다. 1) InnoDB는 기본 및 고급 검색 쿼리를 지원하는 역 색인화를 통해 전체 텍스트 검색을 구현합니다. 2) 매치 및 키워드를 사용하여 검색, 부울 모드 및 문구 검색을 지원합니다. 3) 최적화 방법에는 워드 세분화 기술 사용, 인덱스의 주기적 재건 및 캐시 크기 조정, 성능과 정확도를 향상시키는 것이 포함됩니다.

이 기사에서는 Drop Table 문을 사용하여 MySQL에서 테이블을 떨어 뜨리는 것에 대해 설명하여 예방 조치와 위험을 강조합니다. 백업 없이는 행동이 돌이킬 수 없으며 복구 방법 및 잠재적 생산 환경 위험을 상세하게합니다.

기사는 외국 열쇠를 사용하여 데이터베이스의 관계를 나타내고 모범 사례, 데이터 무결성 및 피할 수있는 일반적인 함정에 중점을 둡니다.

이 기사에서는 PostgreSQL, MySQL 및 MongoDB와 같은 다양한 데이터베이스에서 JSON 열에서 인덱스를 작성하여 쿼리 성능을 향상시킵니다. 특정 JSON 경로를 인덱싱하는 구문 및 이점을 설명하고 지원되는 데이터베이스 시스템을 나열합니다.
