交叉表查询(TRANSFORM)
sql中没有类似ACCESS的标准交叉表处理功能.
使用CASE和GROUP子句才是正确的选择(sql联机帮助也是这样说的,官方推荐)
动态列的问题,可以通过动态sql语句实现.
--参考:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_qry]
GO
/*--生成交叉表的简单通用存储过程
根据指定的表名,纵横字段,统计字段,自动生成交叉表
并可根据需要生成纵横两个方向的合计
注意,横向字段数目如果大于纵向字段数目,将自动交换纵横字段
如果不要此功能,则去掉交换处理部分
--邹建 2004.06(引用请保留此信息)--*/
/*--调用示例
exec p_qry 'syscolumns','id','colid','colid','name like ''s%''',1,1
--*/
create proc p_qry
@TableName sysname, --表名
@纵轴 sysname, --交叉表最左面的列
@横轴 sysname, --交叉表最上面的列
@表体内容 sysname, --交叉表的数数据字段
@条件 varchar(1000),--查询的处理条件
@是否加横向合计 bit, --为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit --为1时在交叉表纵向最下边加纵向合计
as
declare @s nvarchar(4000),@sql varchar(8000)
--规范条件
set @条件=case when @条件<>'' then ' where ('+@条件+')' else '' end
--判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段
set @s='declare @a sysname
if(select case when count(distinct ['+@纵轴+'])<count(distinct ['+@横轴+']) then 1 else 0 end
from ['+@TableName+'] '+@条件+')=1
select @a=@纵轴,@纵轴=@横轴,@横轴=@a'
exec 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
,N'@s 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(['
+@纵轴+'] as varchar) end'
else '['+@纵轴+']' end
,@sum3=case @是否家纵向合计
when 1 then ' with rollup'
else '' end
--生成交叉表
exec('select '+@sum2+@sql+@sum1+'
from ['+@TableName+']
'+@条件+'
group by ['+@纵轴+']'+@sum3)
go
CSDN中相关链接:
http://topic.csdn.net/t/20041229/10/3684609.html
http://topic.csdn.net/t/20050510/01/3993699.html
http://community.csdn.net/Expert/topic/4815/4815049.xml?temp=.2712061
http://topic.csdn.net/t/20050528/09/4041580.html
交叉表查询(TRANSFORM)相关推荐
- 【交叉表查询】行列转换的魅力
本文主要是讲一下行列转换,也就是大家经常讲的交叉表查询. 行列转换在实际的应用中非常的实用,可以大大的减少工作量. 很多时候,在Excel中处理数据时,我们需要统计每个月的销量或者需要填写每个月的销量 ...
- Mysql5 实现交叉表查询
交叉表.行列转换和交叉查询经典 一.什么是交叉表 "交叉表"对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: ...
- 交叉表查询中的多列显示
利用交叉表,我们可以对某个列字段的项目进行显示,比如[学科]来显示[考试成绩],那么是否能同时显示其[作业成绩]在同一个交叉表查询中? 比如下面数据 Table3 +-----+--------+-- ...
- 交叉表查询中的多列显示。
利用交叉表,我们可以对某个列字段的项目进行显示,比如[学科]来显示[考试成绩],那么是否能同时显示其[作业成绩]在同一个交叉表查询中? 比如下面数据 Table3 +-----+--------+-- ...
- 创建交叉表_质性数据分析软件NVivo教程:交叉表查询
交叉表查询提供了一种快速的方法来检查案例和人口统计变量之间的编码分布.例如,您可以使用交叉表查询来: 检查受访者回答某特定主题或问题的频率. 比较不同人口群体对主题的看法. 在运行交叉表查询之前,您需 ...
- java动态交叉表,SqlServer如何生成动态交叉表查询
为了说明问题,我们用SqlServer自带的事例数据库(Northwind)来进行验证,所有的例子请放到Northwind中运行,我可能会省略Use语句,所引用的表,都是Northwind中的,下面我 ...
- ireport交叉报表 crosstab排序_质性数据分析软件NVivo教程:交叉表查询
交叉表查询提供了一种快速的方法来检查案例和人口统计变量之间的编码分布.例如,您可以使用交叉表查询来: 检查受访者回答某特定主题或问题的频率. 比较不同人口群体对主题的看法. 在运行交叉表查询之前,您需 ...
- 交叉表 mysql_mysql交叉表查询解决方案整理
交叉表是一种常用的分类汇总查询.使用交叉表查询,可以显示表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部.行和列的交叉处可以对数据进行多种汇总计算,如:求和.平均值 ...
- 在MySQL中实现交叉表查询2(动态交叉表)
在MySQL中实现交叉表查询2(动态交叉表) 交叉表分为静态交叉表和动态交叉表.其中静态交叉表中的列是固定的,因此相对容易实现:而动态交叉表中的列需要动态生成. 一.静态交叉表的实现 参见上一篇文章: ...
- Mysql的交叉表查询
最近由于找工作,所以在恶补PHP和Mysql方面的东西,发现还是学习的不够.这几天看到关于mysql的交叉表查询的内容,根据自己的理解简单的尝试了下. 由于MonsterHunter World较火, ...
最新文章
- Oracle数据库物理存储结构管理
- MySQL(1)数据库介绍,配置MySQL的tab补全
- linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞
- 不知道自己是否适合做产品经理
- C# using 使用方法
- 实验3-5 查询水果价格 (15 分)
- TeaVM奇怪的编译现象:同样代码,编译有时通过有时不通过
- ut-890/485-usb驱动 FOR Linux
- Jmeter在Linux下的运行测试
- offline RL介绍
- html手机号显示错误,手机号码被错误标记有救了 联通开通了查询清除服务
- IMDB排名前250名的电影,你看过几部?
- 怎么用c语言让电脑定时开关机,电脑定时开关机,教您怎么设置电脑定时开关机...
- workerman wss 配置备忘录
- 用计算机刻录光盘,怎么用电脑刻录光盘?将文件刻录光盘的方法和步骤
- 【墨尘】变态心理学(北京大学)
- oracle误删除一条数据库,Oracle误删除数据的恢复方法
- Miktex使用笔记
- Python实现配色自由,展示一下可视化配色方案
- Java使用QQ邮箱发送邮件