



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL交叉表实例 2005-4-8 10:36:35 | By: 孤独的猎人 SQL交叉表实例 建表:在查询分析器里运行:CREATE TABLE Test (id int IDENTITY (1, 1) NOT NULL ,name nvarchar (50) COLLATE Chinese_PRC_CI_AS NULL , subject nvarchar (50) COLLATE Chinese_PRC_CI_AS NULL ,Source numeric(18, 0) NULL ) ON PRIMARYGOINSERT INTO test (name,subject,Source) values (N张三,N语文,60)INSERT INTO test (name,subject,Source) values (N李四,N数学,70)INSERT INTO test (name,subject,Source) values (N王五,N英语,80)INSERT INTO test (name,subject,Source) values (N王五,N数学,75)INSERT INTO test (name,subject,Source) values (N王五,N语文,57)INSERT INTO test (name,subject,Source) values (N李四,N语文,80)INSERT INTO test (name,subject,Source) values (N张三,N英语,100)Go交叉表语句的实现:-用于:交叉表的列数是确定的select name,sum(case subject when 数学 then source else 0 end) as 数学,sum(case subject when 英语 then source else 0 end) as 英语,sum(case subject when 语文 then source else 0 end) as 语文 from test group by name-用于:交叉表的列数是不确定的declare sql varchar(8000)set sql = select name,select sql = sql + sum(case subject when +subject+ then source else 0 end) as +subject+,from (select distinct subject from test) as aselect sql = left(sql,len(sql)-1) + from test group by nameexec(sql)go一个通用的针对单表用的交叉表存储过程传入几个参数:TableName varchar(16) -表名纵轴 varchar(20) -交叉表最左面的列横轴 varchar(10) -交叉表最上面的列表体内容 numeric(10,2) -交叉表的数字内容是否加横向合计 bit -为1时在交叉表横向最右边加横向合计是否家纵向合计 bit -为1时在交叉表纵向最下边加纵向合计思路:1、取得disinct 横轴字段 后,取得唯一的横轴字段表2、根据横轴的唯一字段内容,循环整个表后动态生成一个Sql语句,像select 科室,sum(case(横轴字段表.).) from tablename group by 科室exec 生成的Sql3、根据参数是否合计,分别加合计字段,求出横向合计和纵向合计您看这个思路行吗?但有一个限制就是横轴不能太多,多了Sql可能会超过8000字符。一般不会这么多,如果太多就把横轴变为纵轴,总之取字段较少的做横轴,这个就是传参数时的问题了。如果弄成了,这个在一定的范围内应该是比较通用的了。对不!这是我的思路,具体写的时候,感觉到Sql的组合比较麻烦,能帮我写一下吗?=if exists (select * from dbo.sysobjects where id = object_id(Ndbo.p_qry) and OBJECTPROPERTY(id, NIsProcedure) = 1)drop procedure dbo.p_qryGO/*-生成交叉表的简单通用存储过程根据指定的表名,纵横字段,统计字段,自动生成交叉表并可根据需要生成纵横两个方向的合计注意,横向字段数目如果大于纵向字段数目,将自动交换纵横字段如果不要此功能,则去掉交换处理部分-邹建 204.06-*/*-调用示例exec p_qry syscolumns,id,colid,colid,name like s%,1,1-*/create proc p_qryTableName sysname, -表名纵轴 sysname, -交叉表最左面的列横轴 sysname, -交叉表最上面的列表体内容 sysname, -交叉表的数数据字段条件 varchar(1000),-查询的处理条件是否加横向合计 bit, -为1时在交叉表横向最右边加横向合计是否家纵向合计 bit -为1时在交叉表纵向最下边加纵向合计asdeclare s nvarchar(4000),sql varchar(8000)-规范条件set 条件=case when 条件 then where (+条件+) else end-判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段set s=declare a sysnameif(select case when count(distinct +纵轴+)from +TableName+ +条件+)=1select a=纵轴,纵轴=横轴,横轴=aexec sp_executesql s,N纵轴 sysname out,横轴 sysname out,纵轴 out,横轴 out-生成交叉表处理语句set s=set s=select s=s+,+cast(+横轴+ as varchar)+=sum(case +横轴+ when +cast(+横轴+ as varchar)+ then +表体内容+ else 0 end)from +TableName+条件+group by +横轴+exec sp_executesql s,Ns varchar(8000) out,sql out-是否生成合计字段的处理declare sum1 varchar(200),sum2 varchar(200),sum3 varchar(200)select sum1=case 是否加横向合计 when 1 then ,合计=sum(+表体内容+)else end,sum2=case 是否家纵向合计 when 1 then +纵轴+=case grouping(+纵轴+) when 1 then 合计 else cast(+纵轴
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一童装店活动方案
- 六一背诵活动方案
- 六一跳蚤市场活动方案
- 六一限时活动方案
- 云南医护考试真题及答案
- 药师三基考试试题及答案
- 药店主管考试试题及答案
- 兰亭装饰活动策划方案
- 兰州汽车创意活动方案
- 共享单车宣传活动方案
- GB/T 36478.4-2019物联网信息交换和共享第4部分:数据接口
- GB/T 1690-2010硫化橡胶或热塑性橡胶耐液体试验方法
- 印制电路板领域:深南电路企业组织结构及部门职责
- 年产120万吨氧化铝拜尔法生产高压溶出工艺设计
- 《哈尔滨工程大学学报》模板
- DB14T 1049.1-2020 山西省用水定额 第1部分:农业用水定额
- 配载平衡基础培训
- 医疗废物管理相关法律、法规介绍
- 漯河医学高等专科学校辅导员招聘考试行政管理教师岗笔试面试历年真题库试卷
- 政审在校证明
- 变电站一次通流-通压试验方法的探讨与实践
评论
0/150
提交评论