求不同時間段匯總的優化算法!

yrwx001 2007-09-12 02:31:06
現有表tb1
itemno date Qty
a 20050601 30
b 20050602 40
c 20060601 20
a 20060701 30
b 20070504 50
......................
求各個產品不同時間段的sum(Qty)
假如是要 求 200506 ,2006,2007 的 sum(Qty)
現在的算法是
create function dbo.fn_test(@itemno varchar(10),@iFlag int)
returns FLOAT --@iFlag = 1 200506 的sum 2 2006 3 2007
as
begin
declare @fValue float
select @fValue = sum(Qty) from tb1
where itemno = @itemno
and left(date,6) = case @iFlag when 1 then '200506'
else left(date,6) end
and left(date,4) = case @iFlag when 2 then '2006'
when 3 then '2007'
else left(date,4) end
return @fValue
end
go

select itemno,Qty1 = dbo.fn_test(itemno,1)
,Qty2 = dbo.fn_test(itemno,2)
,Qty3 = dbo.fn_test(itemno,3)
from tb1 group by itemno

但是在實際過程中,數據要多的多,要複雜的多,這種算法就顯得比較慢.
請問有沒有其他好的算法?
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yrwx001 2007-09-13
  • 打赏
  • 举报
回复
頂上去
yrwx001 2007-09-12
  • 打赏
  • 举报
回复
截止日期是 20070520
yrwx001 2007-09-12
  • 打赏
  • 举报
回复
還是不怎嚜好處理,這裡面涉及到一個截止日期的問題,問題如下:
假設 截止日為 20070220 側,2007年只統計該日之前的Qty
現有表tb1
itemno date Qty
a 20050601 30
b 20050602 40
c 20060601 20
a 20060701 30
b 20070504 50
b 20070524 60
......................
求各個產品不同時間段的sum(Qty)
假如是要 求 200506 ,2006,2007 的 sum(Qty)
現在的算法是
create function dbo.fn_test(@itemno varchar(10),@iFlag int)
returns FLOAT --@iFlag = 1 200506 的sum 2 2006 3 2007
as
begin
declare @fValue float
select @fValue = sum(Qty) from tb1
where itemno = @itemno
and left(date,6) = case @iFlag when 1 then '200506'
else left(date,6) end
and left(date,4) = case @iFlag when 2 then '2006'
else left(date,4) end
and date >= case @iFlag when 3 then '20070101' else '00010101' end
and daye <= case @iFlag when 3 then '20070520' else '99991231' end
return @fValue
end
go

select itemno,Qty1 = dbo.fn_test(itemno,1)
,Qty2 = dbo.fn_test(itemno,2)
,Qty3 = dbo.fn_test(itemno,3)
from tb1 group by itemno

但是在實際過程中,數據要多的多,要複雜的多,這種算法就顯得比較慢.
請問有沒有其他好的算法?

dawugui 2007-09-12
  • 打赏
  • 举报
回复
做交叉查詢?
这个是什么意思?
yrwx001 2007-09-12
  • 打赏
  • 举报
回复
select itemno,Qty1 = dbo.fn_test(itemno,1)
,Qty2 = dbo.fn_test(itemno,2)
,Qty3 = dbo.fn_test(itemno,3)
from tb1 group by itemno

而且要以我這個形式出現,還要在你的基礎上做交叉查詢,是不是麻煩了點?
dawugui 2007-09-12
  • 打赏
  • 举报
回复
可以临时创建一表,用完后删除.
yrwx001 2007-09-12
  • 打赏
  • 举报
回复
200506 ,2006,2007 這個時間段是根據前台給定的某個日期 處理得到的,
難道我還要 建個臨時表,把這些值放進去,然後再做連結?
dawugui 2007-09-12
  • 打赏
  • 举报
回复
create table tb1(itemno varchar(10),[date] varchar(10),Qty int)
insert into tb1 values('a', '20050601', 30)
insert into tb1 values('b', '20050602', 40)
insert into tb1 values('c', '20060601', 20)
insert into tb1 values('a', '20060701', 30)
insert into tb1 values('b', '20070504', 50)
create table tb2([date] varchar(10))
insert into tb2 values('200506')
insert into tb2 values('2006')
insert into tb2 values('2007')
go
select tb1.itemno,tb2.date,sum(tb1.qty) qty
from tb2 left join tb1 on charindex(tb2.date , tb1.date) > 0
group by itemno,tb2.date

drop table tb1,tb2

/*
itemno date qty
---------- ---------- -----------
a 200506 30
b 200506 40
a 2006 30
c 2006 20
b 2007 50

(所影响的行数为 5 行)
*/
dawugui 2007-09-12
  • 打赏
  • 举报
回复
select tb1.itemno,tb2.date,sum(tb1.Qty) Qty from tb2,tb1 where charindex(tb2.date,tb1.date) > 0
group by itemno,date
dawugui 2007-09-12
  • 打赏
  • 举报
回复
現有表tb1
itemno date Qty
a 20050601 30
b 20050602 40
c 20060601 20
a 20060701 30
b 20070504 50
......................
求各個產品不同時間段的sum(Qty)
假如是要 求 200506 ,2006,2007 的 sum(Qty)
tb2
date
200506
2006
2007

假设date为字符串型.

select tb2.date,sum(tb1.Qty) Qty from tb2,tb1 where charindex(tb2.date,tb1.date) > 0
group by tb2.date

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧