当前位置: 首页 > news >正文

利用SQL存储过程创建交叉表

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go





/**/ /*--生成交叉表的简单通用存储过程

根据指定的表名,纵横字段,统计字段,自动生成交叉表
并可根据需要生成纵横两个方向的合计

注意,横向字段数目如果大于纵向字段数目,将自动交换纵横字段
如果不要此功能,则去掉交换处理部分

*/


/**/ /*--调用示例

execp_qry'syscolumns','id','colid','colid','namelike''s%''',1,1
--
*/


ALTER proc [ dbo ] . [ proc_ViewDriverDicpatch ]
@TableName sysname, -- 表名
@纵轴 sysname, -- 交叉表最左面的列
@横轴 sysname, -- 交叉表最上面的列
@表体内容 sysname, -- 交叉表的数数据字段
@条件 varchar ( 1000 ), -- 查询的处理条件
@是否加横向合计 bit , -- 为1时在交叉表横向最右边加横向合计
@是否加纵向合计 bit -- 为1时在交叉表纵向最下边加纵向合计
as
declare @s nvarchar ( 4000 ), @sql varchar ( 8000 )

-- 规范条件
/**/ /*set@条件=casewhen@条件<>''then'where('+@条件+')'else''end*/

-- 判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段
/**/ /*
set@s='declare@asysname
if(selectcasewhencount(distinct[@纵轴])from'+@TableName+')=1
select@a=@纵轴,@纵轴=@横轴,@横轴=@a'
execsp_executesql@s
,N'@纵轴sysnameout,@横轴sysnameout'
,@纵轴out,@横轴out
*/

-- 生成交叉表处理语句
set @s = '
set@s=
''''
select@s=@s+
'' ,[ '' +cast([ ' + @横轴 + ' ]asvarchar)+ '' ]=sum(case[ ' + @横轴
+ ' ]when '''''' +cast([ ' + @横轴 + ' ]asvarchar)+ '''''' then[ ' + @表体内容 + ' ]else0end) ''
from[
' + @TableName + ' ]
' + @条件 + '
groupby[
' + @横轴 + ' ] '
exec sp_executesql @s
,N
' @svarchar(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 ' [ ' + @纵轴 + ' ]=casegrouping([ '
+ @纵轴 + ' ])when1then '' 合计 '' elsecast([ '
+ @纵轴 + ' ]asvarchar)end '
else ' [ ' + @纵轴 + ' ] ' end
,
@sum3 = case @是否加纵向合计
when 1 then ' withrollup '
else '' end

-- 生成交叉表
exec ( ' select ' + @sum2 + @sql + @sum1 + '
from[
' + @TableName + ' ]
' + @条件 + '
groupby[
' + @纵轴 + ' ] ' + @sum3 )






相关文章:

  • Program received signal SIGUSR1, User defined signal 1.解决方法
  • 在Linux中创建静态库.a和动态库.so
  • 弹出窗口中修改值数据后,父窗口中加载修改后的数据
  • makefile查找文件是否含某特定字符,若没有才添加;
  • makefile查找文件是否存在,不存在才拷贝;
  • 企业财务报表的分析方法(The analysis of financial statements)
  • c/c++经典面试题
  • 分形艺术 ---- 忘却记忆
  • char和unsigned char--数据类型区别
  • 一个电脑**和黑客的对话(笑死你)
  • Python使用Glob查找文件
  • 关于struts2
  • python 3.8 yolov5 烟火检测配置
  • Simple iptables
  • Yolov4烟火检测
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【comparator, comparable】小总结
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ECMAScript6(0):ES6简明参考手册
  • Javascript弹出层-初探
  • Js基础——数据类型之Null和Undefined
  • js学习笔记
  • js作用域和this的理解
  • mockjs让前端开发独立于后端
  • Redis学习笔记 - pipline(流水线、管道)
  • session共享问题解决方案
  • Vue学习第二天
  • yii2权限控制rbac之rule详细讲解
  • 记一次和乔布斯合作最难忘的经历
  • 每天一个设计模式之命令模式
  • 什么是Javascript函数节流?
  • 应用生命周期终极 DevOps 工具包
  • 7行Python代码的人脸识别
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (52)只出现一次的数字III
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)visual stdio 书签功能介绍
  • (转载)Linux 多线程条件变量同步
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core 中的路径问题
  • .NET Core使用NPOI导出复杂,美观的Excel详解