SQL实现交叉表的方法
发布时间:2021-01-14 09:01:56 所属栏目:MySql教程 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 --交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实---现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 --交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实---现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态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 '[email?protected]+' FROM '[email?protected] CREATE TABLE #FIELD(FIELD VARCHAR(30)) --将列字段提取到临时表#FIELD中 INSERT INTO #FIELD EXEC(@SQL) SELECT @SQL='CREATE TABLE CROSS_TEST('[email?protected]+' 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='['[email?protected]+']' SELECT @[email?protected][email?protected]+' 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('[email?protected]+') SELECT DISTINCT '[email?protected]+' FROM '[email?protected] --将行数据存入交叉表#CROSS_TEST EXEC(@SQL) --创建分组数据表TEMP SELECT @SQL='CREATE TABLE TEMP('[email?protected]+' VARCHAR(30),'[email?protected]+' VARCHAR(30),'[email?protected]+' DECIMAL(8,2))' EXEC(@SQL) --将交叉汇总数据放入交叉表 SELECT @SQL='SELECT '[email?protected]+','[email?protected]+',SUM(QTY) QTY FROM '[email?protected] +' GROUP BY '[email?protected]+','[email?protected] 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='['[email?protected]+']',@Q1=CAST(@QTY AS VARCHAR(30)) SELECT @SQL='UPDATE CROSS_TEST SET '[email?protected]+'='[email?protected]+' WHERE '[email?protected]+'='''[email?protected]+'''' EXEC(@SQL) FETCH CUR_SUM INTO @F1,@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条件啦,字符类型字段查询时条件必须加单引号,如果是数值类型就可以直接写,所以数值类型的分类字段更容易实现一些,更可以融合在一个过程中。通常大家看到的交叉表都有行汇总与列汇总等信息,本例就没有实现,最后一点工作大家自己练练手吧。*/ 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |