极难的算法,求高手指教

vivachiu926 2005-07-19 04:07:46
加精
我要求一个算法,是每月销量的对比,比如:输入6月9日,输出的是6月1号到9号的、5月1号到9号、4月1号到9号...销量比对,但数据库中的销量是周销量,也就是说非整周的销量,要除以5(表示去掉周六周日),乘以天数。。。类似输入6月30日等等
...全文
472 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
冷箫轻笛 2005-07-20
  • 打赏
  • 举报
回复
跟我说的吗?
vivachiu926 2005-07-20
  • 打赏
  • 举报
回复
谢谢,虽然是按周记的,但也有好几十年的数据,而且这里是让user用web端查询的销售报表,并且该web页还需要做去其他查询,您这样做web端的改动就太大了,能不能不动select后面的字段,只处理where后面的salesdate,另外sum(quantity)是作为参数传到存储过程的,可以sum (case when...)
soapyboy 2005-07-20
  • 打赏
  • 举报
回复
其实我的意思只是一个思路,你可以把新表改成临时表不就可以了么,
冷箫轻笛 2005-07-20
  • 打赏
  • 举报
回复
也就是说统计的数据里面其实周六周日都是没有销售量的!?
我把一个周的数据转换成周一至周五的销量
因为统计的时候如果不是整周,其实统计的是平均值!
冷箫轻笛 2005-07-20
  • 打赏
  • 举报
回复
虽然麻烦点,但是可以实现,而且数据是按周来记的,数据量应该不大
---------------------------------------------------------
select month+'01至'+month+cast(day(参数) as varchar),sum(quantity) as quantity from
(select left(convert(varchar(10),salesdate,120),8) as month,
right(convert(varchar(10),salesdate,120),2) as day, from
(
select dateadd(day,-6,salesdate) as salesdate,quantity/5 as quantity from 表
union all
select dateadd(day,-5,salesdate) as salesdate,quantity/5 as quantity from 表
union all
select dateadd(day,-4,salesdate) as salesdate,quantity/5 as quantity from 表
union all
select dateadd(day,-3,salesdate) as salesdate,quantity/5 as quantity from 表
union all
select dateadd(day,-2,salesdate) as salesdate,quantity/5 as quantity from 表
)t1
)t2
where cast(day as int)<=day(参数)
group by month
----------------------------------------------------------
这里的参数必须是日期格式的
不知道我理解的有问题没?
vivachiu926 2005-07-20
  • 打赏
  • 举报
回复
表的结构是无法改动的,故不能把周日的销量平均为5分,然后分放到周一到周五中,数据库的有2个分管销量的table ,一个为sales 该表记录了销售单据,销售日期,经销商id ,零售店id,
另一个为salesdetail表,里面分别记录了,该单据下各个产品的销量,以及销售类型:有直销转批什么的,两张表相关联才能得到销量,以及该销量所在的周,所以这里只是一个算法问题,而不能从更改表结构的角度去考虑,谢谢阿
冷箫轻笛 2005-07-20
  • 打赏
  • 举报
回复
我错了,没有看到楼主上面发的帖子
冷箫轻笛 2005-07-20
  • 打赏
  • 举报
回复
楼主没有明白我的意思!
你数据库的表结构可以贴出来吗?
有一个重要的因素是你如何标记每个周,比方说一种方法是记周一
------------------------------
日期 销量
2005-07-04 1500
2005-07-11 5000
... ...
------------------------------
或者干脆记周序号
------------------------------
周 销量
第35周 1500
第36周 5000
------------------------------
楼主你的是什么样的阿?
我觉得如果你的主键合理的话这个算法应该不难
冷箫轻笛 2005-07-20
  • 打赏
  • 举报
回复
一年有50多个周,算你50年也就最多3000条数据
所以速度是不成问题的。

sum(quantity)是作为参数传到存储过程的。
我想知道你的存储过程是不是就是简单的select @字段 from @表 where @条件 group by @分组条件
如果是的话也可以实现阿.

如果不是这样的话你要的结果是什么样的那?
我指的是结果的格式
有几列,内容是什么?
owen1982_2004 2005-07-20
  • 打赏
  • 举报
回复
学习中......
yougufengye 2005-07-20
  • 打赏
  • 举报
回复
UP 观望中....
vivachiu926 2005-07-20
  • 打赏
  • 举报
回复
是的:)
soapyboy 2005-07-19
  • 打赏
  • 举报
回复

--创建环境

CREATE TABLE SALEQUAN(ID INT,QUANTITY NUMERIC(8,2),SALESDATE DATETIME)
CREATE TABLE SALEQUAN1(ID INT,QUANTITY NUMERIC(8,2),SALESDATE DATETIME)
truncate table salequan
truncate table salequan1
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(1,150,'2005-4-3')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(2,105,'2005-4-10')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(3,220,'2005-4-17')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(4,55,'2005-4-24')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(10,50,'2005-5-1')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(12,50,'2005-5-8')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(13,15,'2005-5-15')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(14,22,'2005-5-22')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(15,555,'2005-5-29')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(21,50,'2005-6-5')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(22,15,'2005-6-12')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(23,22,'2005-6-19')
INSERT INTO SALEQUAN(ID,QUANTITY,SALESDATE)VALUES(24,555,'2005-6-26')

--我用到了de 方式可能和楼主要的不一样,看能否给楼主一些启示咯
--将每一个星期天的数据分为5份做为每个星期的数据星期一--五的数据插入新表中,
--那么原题的解法就将变得简单只要查找日期时段内的汇总对比数就可以了

--将salequan表中的每一个数据插入新表中
--定义游标,将原表中每一个星期天的数据拆开插入新表中,新表中为每一个星期非星期六日的数据
DECLARE @sq_id int, @sq_quan numeric(8,2), @sq_date datetime

DECLARE sq_cursor CURSOR FOR
SELECT id, quantity, salesdate
FROM salequan

OPEN sq_cursor

FETCH NEXT FROM sq_cursor
INTO @sq_id, @sq_quan, @sq_date
WHILE @@FETCH_STATUS = 0
BEGIN
set @sq_date=dateadd(day,-2,@sq_date)
while datepart(dw,@sq_date)>1
begin
insert into salequan1(id,quantity,salesdate)values(@sq_id,@sq_quan/5,@sq_date)
set @sq_date=dateadd(day,-1,@sq_date)
end
FETCH NEXT FROM sq_cursor
INTO @sq_id, @sq_quan, @sq_date
end
CLOSE sq_cursor
DEALLOCATE sq_cursor

--获取数据
select sum(quantity) from salequan1 where datepart(day,salesdate)!>22 and salesdate!>'2005-06-22' group by datepart(m,salesdate)
--明细数据
select * from salequan1 where datepart(day,salesdate)!>22 and salesdate!>'2005-06-22' order by salesdate

--结果:
--410.00
--87.00
--400.00


filebat 2005-07-19
  • 打赏
  • 举报
回复
是真的比较麻烦.

有一个问题: 2005年的最后一个星期日是12月25号.
如果你现在输入一个12月27号, 那26号, 27号的销售额如何计算?
这周的数据要到2006年1月1号才知道啊.
kindwell 2005-07-19
  • 打赏
  • 举报
回复
楼主像这样描述就比较清楚了,一定会有人有时间想这个算法。
vivachiu926 2005-07-19
  • 打赏
  • 举报
回复
当然还要group by month(salesdate) 拜托大家了,谢谢:)
因为这里求的可能是好几年的同期销量
vivachiu926 2005-07-19
  • 打赏
  • 举报
回复
我要求一个算法,是每月销量的对比,比如:输入6月9日,输出的是6月1号到9号的、5月1号到9号、4月1号到9号...销量比对,但数据库中的销量是周销量,也就是说非整周的销量,要除以5(表示去掉周六周日),乘以天数。。。类似输入6月30日等等

表的结构:salesid quantity salesdate
... ... ....
22 50 2005-6-5
23 15 2005-6-12
24 22 2005-6-19
25 555 2005-6-26
26 321 2005-7-3
... ... ....

salesdate为周日,要sum(quanity) 就是要求月初到输入日期那天的销量,即每个月同段时间销量比对,这里只举了一个月

另外如果是输入6月30号,则要把6-5日的quantity/5*3 把7月3日的quantitiy/5*4 以及12、19,26号的quantity 相加,则为6月的销量 注:6月1日2日3日为周三周四周五,6月27,28,29,30为周一到周四
vivachiu926 2005-07-19
  • 打赏
  • 举报
回复
我要求一个算法,是每月销量的对比,比如:输入6月9日,输出的是6月1号到9号的、5月1号到9号、4月1号到9号...销量比对,但数据库中的销量是周销量,也就是说非整周的销量,要除以5(表示去掉周六周日),乘以天数。。。类似输入6月30日等等

表的结构:salesid quantity salesdate
... ... ....
22 50 2005-6-5
23 15 2005-6-12
24 22 2005-6-19
25 555 2005-6-26
26 321 2005-7-3
... ... ....

salesdate为周日,要sum(quanity) 就是要求月初到输入日期那天的销量,即每个月同段时间销量比对,这里只举了一个月
冷箫轻笛 2005-07-19
  • 打赏
  • 举报
回复
datepart()可以取到星期
明天继续关注
ahFaye 2005-07-19
  • 打赏
  • 举报
回复
谁知道周末在几号啊
9天有两个周末怎么板
加载更多回复(3)

27,579

社区成员

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

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