全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中国船用压载水处理过滤器国际公约合规研究
- 2025中国自动驾驶汽车产业政策支持与商业前景评估报告
- 2025中国自动驾驶技术发展分析及前景趋势与投资机会风险研究报告
- 2025中国美甲产品产业链整合与渠道变革分析报告
- 2025中国美妆订阅制商业模式与用户留存分析报告
- 2026年中国乌贼鱼项目经营分析报告
- 资金管理优化与现金流预测方案
- 2025中国美妆行业小程序生态运营与转化率提升
- 2025中国美妆电商渠道变革与消费者行为研究
- 财务分析师高级财务报告解读技巧
- 咏史完整版本
- 汉字笔画练习字帖
- 塔磨机安全操作规程
- 消防水泵房巡检签到表
- 全科医师转岗培训理论考试试题及答案
- 公会之间挂靠主播合作协议书
- 实验三基因组序列分析
- 2022年澄迈县辅警招聘笔试试题及答案解析
- 小学语文人教三年级上册 童话中有趣的角色
- 2022年临沧边境经济合作区国有资本投资运营有限公司招聘笔试试题及答案解析
- 思想道德与法治课件:第六章 第三节 维护宪法权威
评论
0/150
提交评论