[SQL] SQL实现交叉表的方法 →→→→→进入此内容的聊天室

来自 , 2020-08-06, 写在 SQL, 查看 110 次.
URL http://www.code666.cn/view/1d0832c4
  1. --交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实---现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态SQL等非常熟悉,而--且思路也要清淅,本例以PUBS.DBO.SALES表的数据做样本:
  2. CREATE PROCEDURE UP_TEST(
  3. @T1 VARCHAR(30),@T2 VARCHAR(30),
  4. @T3 VARCHAR(30),@T4 VARCHAR(30)) AS
  5. --T1 表名,T2,T3是交叉表的两上分类字段,T4是汇总字段
  6. --T2是行字段,T3列字段
  7. BEGIN
  8. DECLARE @SQL VARCHAR(7999),@FIELD VARCHAR(30)
  9.  SELECT @SQL='SELECT DISTINCT '+@T3+' FROM '+@T1
  10.  CREATE TABLE #FIELD(FIELD VARCHAR(30))
  11.  --将列字段提取到临时表#FIELD中
  12.  INSERT INTO #FIELD EXEC(@SQL)
  13.  SELECT @SQL='CREATE TABLE CROSS_TEST('+@T2+' VARCHAR(30),'
  14.  DECLARE CUR_FIELD CURSOR LOCAL FOR SELECT * FROM #FIELD
  15.  OPEN CUR_FIELD
  16.  FETCH CUR_FIELD INTO @FIELD
  17.  WHILE @@FETCH_STATUS=0 BEGIN
  18.    SELECT @FIELD='['+@FIELD+']'
  19. SELECT @SQL=@SQL+@FIELD+' DECIMAL(8,2) DEFAULT 0,'
  20.    FETCH CUR_FIELD INTO @FIELD
  21.  END
  22.  SELECT @SQL=LEFT(@SQL,LEN(@SQL)-1)+')'
  23.  --创建临时交叉表CROSS_TEST
  24.  EXEC(@SQL)
  25.  SELECT @SQL='INSERT INTO CROSS_TEST('+@T2+') SELECT DISTINCT '+@T2+' FROM '+@T1
  26. --将行数据存入交叉表#CROSS_TEST
  27. EXEC(@SQL)
  28.  --创建分组数据表TEMP
  29.  SELECT @SQL='CREATE TABLE TEMP('+@T2+' VARCHAR(30),'+@T3+' VARCHAR(30),'+@T4+' DECIMAL(8,2))'
  30.  EXEC(@SQL)
  31.  --将交叉汇总数据放入交叉表
  32.  SELECT @SQL='SELECT  '+@T2+','+@T3+', SUM(QTY) QTY FROM '+@T1 +' GROUP BY '+@T2+','+@T3
  33.  INSERT INTO TEMP EXEC(@SQL)
  34.  --将汇总数据写入交叉表
  35.  DECLARE CUR_SUM CURSOR LOCAL FOR SELECT * FROM TEMP
  36.  DECLARE @F1 VARCHAR(30),@F2 VARCHAR(30),@QTY DECIMAL(8,2),@Q1 VARCHAR(30)
  37.  OPEN CUR_SUM
  38.  FETCH CUR_SUM INTO @F1,@F2,@QTY
  39.  WHILE @@FETCH_STATUS=0 BEGIN
  40.    SELECT @F2='['+@F2+']',@Q1=CAST(@QTY AS VARCHAR(30))
  41.    SELECT @SQL='UPDATE CROSS_TEST SET '+@F2+'='+@Q1+' WHERE '+@T2+'='''+@F1+''''
  42.    EXEC(@SQL)
  43.    FETCH CUR_SUM INTO @F1,@F2,@QTY
  44.  END
  45.  CLOSE CUR_SUM
  46.  SELECT * FROM CROSS_TEST
  47.  DROP TABLE TEMP  
  48.  DROP TABLE CROSS_TEST
  49.  DROP TABLE #FIELD
  50. END
  51. --------------------------------------------------------
  52. EXEC UP_TEST 'SALES','TITLE_ID','STOR_ID','QTY'
  53. /*说明:字段加中括号为了处理字段中含有特殊字符,值得注意得是要实现交叉表的表必须有两个分类,本例只支持分类字段的数据类型是字符型的,最大的问题就是高亮显示这行的WHERE条件啦,字符类型字段查询时条件必须加单引号,如果是数值类型就可以直接写,所以数值类型的分类字段更容易实现一些,更可以融合在一个过程中。通常大家看到的交叉表都有行汇总与列汇总等信息,本例就没有实现,最后一点工作大家自己练练手吧。*/
  54. //SQL/1206

回复 "SQL实现交叉表的方法"

这儿你可以回复上面这条便签

captcha