• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > SQL实现交叉表的方法

SQL实现交叉表的方法

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了代码片段,代码分享,PHP代码分享,Java代码分享,Ruby代码分享,Python代码分享,HTML代码分享,CSS代等相关知识,希望本文的分享对您有所帮助
--交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实---现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态SQL等非常熟悉,而--且思路也要清淅,本例以PUBS.DBO.SALES表的数据做样本:
CREATE PROCEDURE UP_TEST(
@T1 VARCHAR(30),@T2 VARCHAR(30),
@T3 VARCHAR(30),@T4 VARCHAR(30)) AS
--T1 表名,T2,T3是交叉表的两上分类字段,T4是汇总字段
--T2是行字段,T3列字段
BEGIN
DECLARE @SQL VARCHAR(7999),@FIELD VARCHAR(30)
 SELECT @SQL='SELECT DISTINCT '+@T3+' FROM '+@T1
 CREATE TABLE #FIELD(FIELD VARCHAR(30))
 --将列字段提取到临时表#FIELD中
 INSERT INTO #FIELD EXEC(@SQL)
 SELECT @SQL='CREATE TABLE CROSS_TEST('+@T2+' VARCHAR(30),'
 DECLARE CUR_FIELD CURSOR LOCAL FOR SELECT * FROM #FIELD
 OPEN CUR_FIELD
 FETCH CUR_FIELD INTO @FIELD
 WHILE @@FETCH_STATUS=0 BEGIN
   SELECT @FIELD='['+@FIELD+']'
SELECT @SQL=@SQL+@FIELD+' DECIMAL(8,2) DEFAULT 0,'
   FETCH CUR_FIELD INTO @FIELD
 END
 SELECT @SQL=LEFT(@SQL,LEN(@SQL)-1)+')'
 --创建临时交叉表CROSS_TEST
 EXEC(@SQL)
 SELECT @SQL='INSERT INTO CROSS_TEST('+@T2+') SELECT DISTINCT '+@T2+' FROM '+@T1
--将行数据存入交叉表#CROSS_TEST
EXEC(@SQL)
 --创建分组数据表TEMP
 SELECT @SQL='CREATE TABLE TEMP('+@T2+' VARCHAR(30),'+@T3+' VARCHAR(30),'+@T4+' DECIMAL(8,2))'
 EXEC(@SQL) 
 --将交叉汇总数据放入交叉表
 SELECT @SQL='SELECT  '+@T2+','+@T3+', SUM(QTY) QTY FROM '+@T1 +' GROUP BY '+@T2+','+@T3
 INSERT INTO TEMP EXEC(@SQL)
 --将汇总数据写入交叉表
 DECLARE CUR_SUM CURSOR LOCAL FOR SELECT * FROM TEMP
 DECLARE @F1 VARCHAR(30),@F2 VARCHAR(30),@QTY DECIMAL(8,2),@Q1 VARCHAR(30)
 OPEN CUR_SUM
 FETCH CUR_SUM INTO @F1,@F2,@QTY
 WHILE @@FETCH_STATUS=0 BEGIN
   SELECT @F2='['+@F2+']',@Q1=CAST(@QTY AS VARCHAR(30))
   SELECT @SQL='UPDATE CROSS_TEST SET '+@F2+'='+@Q1+' WHERE '+@T2+'='''+@F1+''''
   EXEC(@SQL)
   FETCH CUR_SUM INTO @F1,@F2,@QTY
 END
 CLOSE CUR_SUM
 SELECT * FROM CROSS_TEST
 DROP TABLE TEMP 
 DROP TABLE CROSS_TEST
 DROP TABLE #FIELD
END
--------------------------------------------------------
EXEC UP_TEST 'SALES','TITLE_ID','STOR_ID','QTY'
/*说明:字段加中括号为了处理字段中含有特殊字符,值得注意得是要实现交叉表的表必须有两个分类,本例只支持分类字段的数据类型是字符型的,最大的问题就是高亮显示这行的WHERE条件啦,字符类型字段查询时条件必须加单引号,如果是数值类型就可以直接写,所以数值类型的分类字段更容易实现一些,更可以融合在一个过程中。通常大家看到的交叉表都有行汇总与列汇总等信息,本例就没有实现,最后一点工作大家自己练练手吧。*/
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 更新数据库中表的统计信息
  • MySQL 存储过程中执行动态 SQL 语句
  • 金额大写转小写SQL
  • 财政年度表之建表约束
  • mysql查询今天,昨天,近7天,近30天,本月,上一月数据方法
  • 统计数据库每天的数据增长量
  • MySql批量插入性能优化
  • 各大数据库分段查询技术的实现方式
  • SQL 循环插入1000条数据
  • 删除SQL 某个表中重复的记录

相关文章

  • 2018-12-05mysql部分替换sql语句分享
  • 2018-12-05Oracle 细粒度审计(FGA)初步认识
  • 2017-05-11Mysql错误Cannot find or open table x/x from the internal问题解决方法
  • 2018-12-05sql 分组查询问题
  • 2017-05-11还原大备份mysql文件失败的解决方法分享
  • 2018-12-05详解MySQL数据库设置主从同步的方法
  • 2018-12-05关于mysql互换表中两列数据方法的讲解
  • 2018-12-05Oracle 数据 使用游标
  • 2018-12-05Oracle Max函数使用中出现的问题
  • 2017-05-11MySQL笔记之数据类型详解

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 有关mysql_affected_rows()函数的文章推荐10篇
    • Oracle时间日期操作方法小结第1/2页
    • 关于优化性能的详细介绍
    • mysql三种批量增加的性能分析
    • MySQL 分组后取时间最新记录
    • Mysql的主从服务器架构配置
    • mysql创建Bitmap_Join_Indexes中的约束与索引
    • 安装Oracle或运行dbca出现ORA-00922和ORA-28000错误
    • 在MySQL字段中使用逗号分隔符的方法分享
    • mysql数据类型详细介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有