SQL实现交叉表的方法

前端之家收集整理的这篇文章主要介绍了SQL实现交叉表的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

--交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实---现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态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),'@L_301_10@+' 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条件啦,字符类型字段查询时条件必须加单引号,如果是数值类型就可以直接写,所以数值类型的分类字段更容易实现一些,更可以融合在一个过程中。通常大家看到的交叉表都有行汇总与列汇总等信息,本例就没有实现,最后一点工作大家自己练练手吧。*/

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

猜你在找的MySQL相关文章