前两天在项目中碰到这样的问题:
有多个结构相同的表,要求在这些表的累加结果集中进行数据统计和查询.
在Googel上找了半天相关资料,硬是没找到我想要的解决办法,咱在这里也不是批评那些抄来抄去的人,乱糟糟的瞎起哄!
由于怕数据量过大而导致程序性能低下,所以当初在项目初期设计表的时候,把一部分类型相同的数据分多个表来存放了,这样导致在统计查询的时候变的复杂了,原来只需要一个查询语句就可以出结果的,可是现在变的复杂去了.
例子描述:
table_a和table_b的结构是相同的,如下:
id type Pro_Sort Content
目的是要把两个表的所有数据都累加起来,然后再对其结果进行统计查询分析.
费了老半天劲找资料也没结果,心情极度郁闷!
后又过了多久我也不知道,突然想起以前在Sql Server的联机帮助里看到临时表的概念,突然就来了灵感,看来平时多看点资料到必要时还是挺有帮助的,嘿 嘿!!!
仔细参详了一番,思路渐渐明晰起来,在存储过程里以创建局部临时表的形式把我需要参与统计的这些表的数据都拿出Insert Into给我的新临时表(不要担心这会给服务器带来什么负担,因为只要过程一结束,局部临时表就会自动清除.),然后我就可以对我创建的局部临时表进行统计了,哈哈!想到这里的时候别提有多兴奋了...
下面供上我在项目中用到的代码片段:
程序代码
在Googel上找了半天相关资料,硬是没找到我想要的解决办法,咱在这里也不是批评那些抄来抄去的人,乱糟糟的瞎起哄!
由于怕数据量过大而导致程序性能低下,所以当初在项目初期设计表的时候,把一部分类型相同的数据分多个表来存放了,这样导致在统计查询的时候变的复杂了,原来只需要一个查询语句就可以出结果的,可是现在变的复杂去了.
例子描述:
table_a和table_b的结构是相同的,如下:
id type Pro_Sort Content
目的是要把两个表的所有数据都累加起来,然后再对其结果进行统计查询分析.
费了老半天劲找资料也没结果,心情极度郁闷!
后又过了多久我也不知道,突然想起以前在Sql Server的联机帮助里看到临时表的概念,突然就来了灵感,看来平时多看点资料到必要时还是挺有帮助的,嘿 嘿!!!
仔细参详了一番,思路渐渐明晰起来,在存储过程里以创建局部临时表的形式把我需要参与统计的这些表的数据都拿出Insert Into给我的新临时表(不要担心这会给服务器带来什么负担,因为只要过程一结束,局部临时表就会自动清除.),然后我就可以对我创建的局部临时表进行统计了,哈哈!想到这里的时候别提有多兴奋了...
下面供上我在项目中用到的代码片段:

存储过程:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pb_All_Ticket]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pb_All_Ticket]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--创建日期:2007/11/26
--功能:以创建临时表的方式,合并所有彩种的代购表数据
--创建人: 程勇
--Msn: chengyong-msn@hotmail.com/QQ:25457788
Create PROCEDURE pb_All_Ticket
@CPType int, --出票类型
@TicketSort varchar(50), --彩 种
@OutBillUser varchar(1000), --出 票 人
@StartTime varchar(50), --搜索开始时间
@EndTime varchar(50), --搜索结束时间
@DateType int --搜索类型:1时间段,2当天,3当月
AS
BEGIN
Create Table #temptable
(
fname varchar(50),
username varchar(50),
userid int,
qinum varchar(50),
zhushu int,
buy_time datetime,
is_fail int,
is_out int,
beishu int
)
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_PlsTicket--排三
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_PlwTicket--排五
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Fc3dTicket--福彩3D
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_QxcTicket--七星彩
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_SsTicket--双色球
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_XwTicket--22x5
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xq29Ticket--29x7
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xq36Ticket--36x7
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_QlcTicket--七乐彩
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_DltTicket--大乐透
insert into #temptable select fname,username,userid,qinum,zhushu,UserBuyTime,is_fail,is_out,beishu from pb_SfcTicket--胜负彩
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xz6Ticket--新足彩6场半
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xz4Ticket--新足彩4场
Declare @tempstr varchar(200)
Declare @sqlstr varchar(500)
Set @tempstr = ''
-----------------------------按出票类别:已出/未出/已撤单---------------------------------
If @CPType<>''
Begin
If @CPType = 1
Set @tempstr = ' and is_out = 0'
Else If @CPType = 2
Set @tempstr = ' and is_out = 1'
Else If @CPType = 3
Set @tempstr = ' and is_fail = 1'
Else
Set @tempstr = ''
End
-------------------------------按彩种-----------------------------------
If @TicketSort<>''
Begin
Set @tempstr = @tempstr + ' and fname like '''+@TicketSort+'%'''
End
-------------------------------按时间类型:当天/当月/自定义时间段-----------------------------------
If @DateType <>''
Begin
--按时间段
If @DateType = 1
Begin
If @StartTime<>'' and @EndTime<>''
Set @tempstr = @tempstr + ' and buy_time between '''+@StartTime+''' and '''+@EndTime+''''
End
--按当天时间
Else If @DateType = 2
Begin
Set @tempstr = @tempstr + ' and Convert(varchar(10),buy_time,120) = Convert(varchar(10),getDate(),120)'
End
--按当月时间
Else If @DateType = 3
Set @tempstr = @tempstr + ' and month(buy_time) = Month(GetDate()) '
End
------------------------------------按出票人--------------------------------------
If @OutBillUser<>''
Begin
Set @tempstr = @tempstr + @OutBillUser
End
Set @sqlstr='Select * From #temptable Where 1=1 '+ @tempstr
Execute(@sqlstr)
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pb_All_Ticket]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pb_All_Ticket]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--创建日期:2007/11/26
--功能:以创建临时表的方式,合并所有彩种的代购表数据
--创建人: 程勇
--Msn: chengyong-msn@hotmail.com/QQ:25457788
Create PROCEDURE pb_All_Ticket
@CPType int, --出票类型
@TicketSort varchar(50), --彩 种
@OutBillUser varchar(1000), --出 票 人
@StartTime varchar(50), --搜索开始时间
@EndTime varchar(50), --搜索结束时间
@DateType int --搜索类型:1时间段,2当天,3当月
AS
BEGIN
Create Table #temptable
(
fname varchar(50),
username varchar(50),
userid int,
qinum varchar(50),
zhushu int,
buy_time datetime,
is_fail int,
is_out int,
beishu int
)
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_PlsTicket--排三
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_PlwTicket--排五
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Fc3dTicket--福彩3D
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_QxcTicket--七星彩
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_SsTicket--双色球
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_XwTicket--22x5
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xq29Ticket--29x7
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xq36Ticket--36x7
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_QlcTicket--七乐彩
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_DltTicket--大乐透
insert into #temptable select fname,username,userid,qinum,zhushu,UserBuyTime,is_fail,is_out,beishu from pb_SfcTicket--胜负彩
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xz6Ticket--新足彩6场半
insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xz4Ticket--新足彩4场
Declare @tempstr varchar(200)
Declare @sqlstr varchar(500)
Set @tempstr = ''
-----------------------------按出票类别:已出/未出/已撤单---------------------------------
If @CPType<>''
Begin
If @CPType = 1
Set @tempstr = ' and is_out = 0'
Else If @CPType = 2
Set @tempstr = ' and is_out = 1'
Else If @CPType = 3
Set @tempstr = ' and is_fail = 1'
Else
Set @tempstr = ''
End
-------------------------------按彩种-----------------------------------
If @TicketSort<>''
Begin
Set @tempstr = @tempstr + ' and fname like '''+@TicketSort+'%'''
End
-------------------------------按时间类型:当天/当月/自定义时间段-----------------------------------
If @DateType <>''
Begin
--按时间段
If @DateType = 1
Begin
If @StartTime<>'' and @EndTime<>''
Set @tempstr = @tempstr + ' and buy_time between '''+@StartTime+''' and '''+@EndTime+''''
End
--按当天时间
Else If @DateType = 2
Begin
Set @tempstr = @tempstr + ' and Convert(varchar(10),buy_time,120) = Convert(varchar(10),getDate(),120)'
End
--按当月时间
Else If @DateType = 3
Set @tempstr = @tempstr + ' and month(buy_time) = Month(GetDate()) '
End
------------------------------------按出票人--------------------------------------
If @OutBillUser<>''
Begin
Set @tempstr = @tempstr + @OutBillUser
End
Set @sqlstr='Select * From #temptable Where 1=1 '+ @tempstr
Execute(@sqlstr)
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO