交叉表—用存储过程实现的普通交叉表(一)

交叉表—用存储过程实现的普通交叉表(一)

开发工具:C#2008/2010

数据库:Sql Server 2000/2005/2008

界面:WinForm

关于交叉表,各位网友用各种方法实现的不少了,本文主要从用存储过程实现交叉表功能进行探讨,这种方法给具体用户也做了不少。界面如下:

一、基本数据结构

(一)销售单主表结构

(二)销售单明细明

(三)由上述两表组成的视图

二、存储过程

--业务经理销售或兑换分品种按客户汇总表
CREATE PROCEDURE YWYXSDHFPZKHHZ
(
@TJTS int,
@StartDate VARCHAR(20),
@EndDate VARCHAR(20),
@YWYID VARCHAR(50),
@KHXZ VARCHAR(50),
@TJFW VARCHAR(50),
@ProCate VARCHAR(50),
@ClientCate VARCHAR(50),
@ChanDi VARCHAR(50),
@returnstring nvarchar(200) out
)

AS

set @StartDate [email protected]+ ‘ 00:00:00‘--查询的开始日期
set @EndDate [email protected]+ ‘ 23:59:59‘--查询的结束日期
set @returnstring=‘日均销量:000‘

DECLARE @FIELD VARCHAR(50),@SQL nvarchar(2000),@SQLCondition varchar(100),@KHMC varchar(50),@chandiA varchar(50),@sl float,@FinalSL varchar(50)

set @SQLCondition=‘ and 1=1‘
--业务经理条件
if(@YWYID<>‘‘)
begin
set @[email protected]+‘ and ywybm=‘‘‘[email protected]+‘‘‘‘
end
--客户性质
if(@KHXZ<>‘‘)
begin
set @[email protected]+‘ and kh_flfs=‘‘‘[email protected]+‘‘‘‘
end
--产品分类
if(@ProCate<>‘‘)
begin
set @[email protected]+‘ and CateID=‘‘‘[email protected]+‘‘‘‘
end
--客户分类
if(@ClientCate<>‘‘)
begin
set @[email protected]+‘ and ClientCateID=‘‘‘[email protected]+‘‘‘‘
end
--品种
if(@ChanDi<>‘‘)
begin
set @[email protected]+‘ and Chandi= ‘‘‘[email protected]+‘‘‘‘
end

--创建临时过渡表结构
Create table #tab1
(
KHMC varchar(50),
pmgg varchar(50),
chandi varchar(50),
sl float
)
--生成临时汇总表结构
Create table #tab2
(
KHMC varchar(50),
chandi varchar(50),
sl float
)
if(@TJFW=‘‘)--销售和兑换数据全部统计
begin
--销售数据
set @SQL=‘SELECT KHMC,pmgg,chandi,sum(sl) as sl FROM VIProCKDPro WHERE pzrq>=‘‘‘[email protected]+‘‘‘ AND pzrq<=‘‘‘[email protected]+‘‘‘ AND lbmc=‘‘销售‘‘ and redword=‘‘F‘‘ ‘[email protected]+‘ GROUP BY KHMC,pmgg,chandi ORDER BY KHMC‘
insert into #tab1 EXEC sp_ExecuteSql @SQL
--兑换数据
set @SQL=‘SELECT KHMC,pmgg,chandi,sum(sl) as sl FROM VIProDHDPro WHERE pzrq>=‘‘‘[email protected]+‘‘‘ AND pzrq<=‘‘‘[email protected]+‘‘‘ and redword=‘‘F‘‘ ‘[email protected]+‘ GROUP BY KHMC,pmgg,chandi ORDER BY KHMC‘
insert into #tab1 EXEC sp_ExecuteSql @SQL
end
else
begin
if(@TJFW=‘销售‘)--仅统计销售数据
begin
--销售数据
set @SQL=‘SELECT KHMC,pmgg,chandi,sum(sl) as sl FROM VIProCKDPro WHERE pzrq>=‘‘‘[email protected]+‘‘‘ AND pzrq<=‘‘‘[email protected]+‘‘‘ AND lbmc=‘‘销售‘‘ and redword=‘‘F‘‘ ‘[email protected]+‘ GROUP BY KHMC,pmgg,chandi ORDER BY KHMC‘
insert into #tab1 EXEC sp_ExecuteSql @SQL
end
else--仅统计兑换
begin
set @SQL=‘SELECT KHMC,pmgg,chandi,sum(sl) as sl FROM VIProDHDPro WHERE pzrq>=‘‘‘[email protected]+‘‘‘ AND pzrq<=‘‘‘[email protected]+‘‘‘ and redword=‘‘F‘‘ ‘[email protected]+‘ GROUP BY KHMC,pmgg,chandi ORDER BY KHMC‘
insert into #tab1 EXEC sp_ExecuteSql @SQL
end
end
--把品种为空的用品名替换
update #tab1 set chandi=pmgg where chandi=‘‘

--再次按品种汇总,并插入临时汇总表
insert into #tab2 select KHMC,chandi,sum(sl) as sl from #tab1 group by KHMC,chandi order by KHMC

--创建临时表,生成给用户的交叉表结构
Create table #tab3
(
客户名称 varchar(50),
合计数量 float
)

--在添加字段前先用#tab2计算结果表给#tab3临时表追加数据,而且必须加distinct
insert into #tab3 (客户名称,合计数量) select KHMC,sum(sl) as sl from #tab2 group by khmc order by KHMC

--给#tab3增加字段

DECLARE CUR_FIELD CURSOR LOCAL FOR SELECT distinct chandi FROM #tab2 order by chandi
OPEN CUR_FIELD
FETCH CUR_FIELD INTO @FIELD
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @FIELD=‘[‘[email protected]+‘]‘
set @SQL=‘alter table #tab3 Add ‘+ @FIELD +‘ FLOAT not NULL DEFAULT 0 With Values‘
EXEC(@SQL)
FETCH CUR_FIELD INTO @FIELD
END

--关闭游标
CLOSE CUR_FIELD
deallocate CUR_FIELD

--给#tab3表的新增字段更新数据

declare CUR_SUM cursor for select KHMC,chandi,sl from #tab2
OPEN CUR_SUM
FETCH CUR_SUM INTO @KHMC,@chandiA,@sl
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @FIELD=‘[‘[email protected]+‘]‘,@FinalSL=CAST(@sl AS VARCHAR(50))
SELECT @SQL=‘UPDATE #tab3 SET ‘[email protected]+‘=‘[email protected]+‘ WHERE [客户名称]=‘‘‘[email protected]+‘‘‘‘
EXEC(@SQL)
FETCH CUR_SUM INTO @KHMC,@chandiA,@sl
END

--关闭游标
CLOSE CUR_SUM
deallocate CUR_SUM

declare @TotalCount float --总销量
declare @averageCount float --日均销量
declare @MFCount float --面粉销量
declare @MTCount float --面条销量
--计算日均销量
select @TotalCount=(select round(sum(sl),2) as sl from #tab2)
if(@TJTS=0)
begin
set @[email protected]
END
else
begin
set @averageCount=round(@TotalCount/@TJTS,2)
END

--计算面粉销量
select @MFCount=(select round(sum(sl),2) as sl from #tab1 where pmgg like ‘%粉%‘ and pmgg not like ‘%条%‘)
--计算面条销量
select @MTCount=(select round(sum(sl),2) as sl from #tab1 where pmgg like ‘%面条%‘)

--日均销量、面粉合计、面条合计返回变量
set @returnstring=‘日均销量:‘+convert(varchar(100),convert(decimal(18,2),@averageCount))+‘ 面粉合计数量:‘+convert(varchar(100),convert(decimal(18,2),@MFCount))+‘ 面条合计数量:‘+convert(varchar(100),convert(decimal(18,2),@MTCount))
select * from #tab3

--删除临时表#tab1
drop table #tab1
drop table #tab2
drop table #tab3
GO

时间: 2024-10-08 21:53:59

交叉表—用存储过程实现的普通交叉表(一)的相关文章

高效多表分页存储过程,可支持多表查询,任意排序

废话不多说,直接上代码: SQL存储过程: CREATE PROCEDURE usp_PagingLarge @TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名 @PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空 @Fields VARCHAR(4000), --要取出的字段,可以是多个表的字段,可以为空,为空表示select * @PageSize INT, --每页记录数 @CurrentPage I

T-SQL 判断 是否存在(数据库,表,存储过程,约束。。。和列)

判断数据库是不是存在  if DB_ID(N'DATABASENAME') is not null 判断表,视图,存储过程,游标的方法综合如下: use databasename--跳转到指定数据库  go if object_id(N'a',N'U') is not null drop table a go 注:a 是一个表,U代表是数据表类型 类似于U的类型代码,如下所示 对象类型: AF = 聚合函数 (CLR) C = CHECK 约束 D = DEFAULT(约束或独立) F = FO

sql sever-T-SQL 判断 是否存在(数据库,表,存储过程,约束。。。和列)

 if DB_ID(N'DATABASENAME') is not null use databasename--跳转到指定数据库  go if object_id(N'a',N'U') is not null drop table a go 注:a 是一个表,U代表是数据表类型 类似于U的类型代码,如下所示 对象类型: AF = 聚合函数 (CLR) C = CHECK 约束 D = DEFAULT(约束或独立) F = FOREIGN KEY 约束 PK = PRIMARY KEY 约束 P

mysql存储过程之游标遍历数据表

原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕迹. 1 BEGIN 2 DECLARE Done INT DEFAULT 0; 3 4 DECLARE CurrentLingQi INT; 5 6 DECLARE ShizuName VARCHAR(30); 7 /* 声明游标 */ 8 DECLARE rs CURSOR FOR SELECT

遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)

本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉. 首先,给出个人用python2.7实现的代码,具体模块已上传到: https://github.com/guojun007/sbx_cross 1 #!/usr/bin/env python 2 #encoding:UTF-8 3 import numpy as np 4 import random 5 6 """ 7 SBX 模拟二进制交叉 8 9 输入: 10 population 种群矩阵 11 a

统计分析表的存储过程遇ORA-00600错误分析与处理

1.            统计分析表的存储过程部分内容 CREATE OR REPLACE procedure SEA.sp_analyze_XXX_a is v_sql_1     varchar2(2000); v_sql_2     varchar2(2000); v_sql_3     varchar2(2000); v_startdate date; err         varchar2(2000); begin v_sql_1 := 'alter session set wor

sql server快速删除整个数据库表和存储过程

情况:在远程数据库删除表执行太慢,表过多,数据库无权删除 结果:保留空数据库 方法:利用sql语句,查询网络文摘解决. 说明: 有些有约束,不能直接delete,需要先删除所有约束,语句: DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; ' from sysobjects where xtype = 'F' open c1 declare

SQLserver 2008同步复制创建后新增表/函数/存储过程(不重新初始化快照)

SQLserver 2008同步复制创建后新增表/函数/存储过程(不重新初始化快照) 一.在生产环境中已有事务复制中(复制类型为事务发布),需要对已有发布的数据库新增表.视图.存储过程等,这些变更是不会同步到从库中.如必须应用到从库,有以下两种方法: 1.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这在生产环境中对数据库压力或性能或DBA可维护性表现的很差. 2.将新增的架构变更新建一个新的发布订阅,但会造成维护困难,增加出错的几率. 3.可以通过设置imm

多表查询存储过程

多表查询存储过程  :看懂了应该会有所收获 1 -- Description: 根据条件查询金融产品信息. 2 -- ============================================= 3 ALTER PROCEDURE [dbo].[SearchProduct] 4 ( 5 @ben1 AS DECIMAL(38, 2) , 6 @yue1 AS INT , 7 @strWhere AS NVARCHAR(MAX), 8 @PageSize as int, 9 @Pag