加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

SQL实现交错表的要领

发布时间:2021-01-15 11:09:01 所属栏目:编程 来源:网络整理
导读:本日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】网络清算供各人参考研究

假如以上内容对您有辅佐,接待保藏、点赞、保举、分享。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读