当前位置: 代码迷 >> Sql Server >> 数据表设计:分时段系数设立
  详细解决方案

数据表设计:分时段系数设立

热度:65   发布时间:2016-04-24 09:17:19.0
数据表设计:分时段系数设置
碰到一个棘手的设计,想了好些天一直没头绪 ,我简化了一下情形,用售货金额计算打个比方吧:
超市里有3种货物,每种货物对应有一个单价,算某一货物售出总额的时候,可以 货物A* 货物A单价 ,如果碰到货物单价 A随着日期变化的情况,这张表应该如何设计呢?比如,2015/1/1-2015/1/3 是货物A的单价a1,2015/1/4-2015/2/5 是货物A的单价a2。(单价变化不是打折,是普通的价格变动,价格在任意时间长度内是连续的,即每天都有一个价格,货物的某一变价开始日期起,直到下一个变价开始日期前一天,都用相同的价格——按前例,货物A的变价开始日期分别是2015/1/1、2015/1/4、2015/2/6)
这张货物价格表我暂时想到是按
货物,开始日期,单价
三列来建表,但是这样的话,虽然只记录变价开始日期就可以描述出所有日期里价格情况,可查询语句写起来让人一点头绪都没有。

如果查询语句就按
销量表:t1,字段【货物】【销售数量】【销售时间】
价格表:t2,字段【货物】【开始日期】【单价】
来处理,当需要查询 2015/1/1 - 2015/2/8 的每类货物的总销售金额(不需要按日期分类,直接汇总出【20150101_20150208】【货物】【总销售额】三列) 的时候,这个就完全无从下手了……还请大侠们指点一下迷津这个表需要不需要调整,还有查询语句应该怎么下手,多谢多谢。
------解决思路----------------------
你是用vc还是命令行调用?
------解决思路----------------------
价格表里多设计一个【结束日期】,查询的时候销售时间就可以落在【开始日期】和【结束日期】之间来拿到对应的【单价】
------解决思路----------------------
我觉得应该在销量表里面,弄个价格字段,因为这是在销售时就知道的信息,为什么还要放到另外一个表里面,而且关联方式还是查询性质的,这样除了事后造数据的用途外,我想没有任何意义
要查还是可以查的,只要描述清楚了问题,需要用的属性都有,都是可以做到的,效率好不好就是另外一回事了
------解决思路----------------------
引用:
Quote: 引用:

我觉得应该在销量表里面,弄个价格字段,因为这是在销售时就知道的信息,为什么还要放到另外一个表里面,而且关联方式还是查询性质的,这样除了事后造数据的用途外,我想没有任何意义
要查还是可以查的,只要描述清楚了问题,需要用的属性都有,都是可以做到的,效率好不好就是另外一回事了


是我例子举得不好,我在这里把实际情况简化了一下,实际每一个对象会有七八个系数,而且这些系数需要时不时进行调整
你是说价格有很多个系数?
那就在销售表里面添加个价格表的ID,即销售表那个销售时间时候所使用的价格系数
------解决思路----------------------
引用:
方便举一下例子吗?非常感谢

销量表:t1,【货物A】【销售数量100】【销售时间2015/3/24 09:58:01】
                  【货物A】【销售数量150】【销售时间2015/3/24 10:58:01】
                  【货物A】【销售数量110】【销售时间2015/3/23 19:58:01】
                  【货物B】【销售数量120】【销售时间2015/3/24 09:58:01】
价格表:t2,【货物A】【开始日期2015/3/20 00:00:00】【结束日期2015/3/23 23:59:59】【单价1.00】
                  【货物A】【开始日期2015/3/24 00:00:00】【结束日期2015/3/26 23:59:59】【单价1.10】
                  【货物B】【开始日期2015/3/24 01:00:00】【结束日期2015/3/26 20:00:00】【单价2.00】

从这数据可以知道t1表货物A在24号分别在9点10点卖掉2比,通过销售时间知道这2比在t2中属于24号开始至26号结束的那个单价,也就是1块1毛。另外一笔23号19点卖出的货物A,通过t2可以知道属于20号至23号的那个区间的单价1块,货物B同理
------解决思路----------------------
我想,这就是空间和时间的转换,
你图个方便,在存储的时候,不存储对应的价格表的ID,虽然减少存储空间,并且可以随意更改价格表的时间,从而改变对应关系,还不用去修改相应的销售表,但这边方便造就了,查询时却要更多时间去比对去判断
如8#楼说的也是一个办法,但同样约束了你价格表的修改,这个计算列无法做到,可以用触发器做到

如果真不改现有表结构,你可以参考这样查询
SELECT t1.货物,SUM(t1.销售数量*t3.单价)AS[总销售额]
FROM t1 CROSS APPLY
(SELECT TOP 1 t2.单价 FROM t2 WHERE t1.货物=t2.货物 AND t1.销售时间>=t2.开始日期 ORDER BY 开始日期 DESC)
t3
GROUP BY t1.货物

------解决思路----------------------
看着评论和你的描述有点乱啊。首先明确的一点你是要查某段日期的销售额是吧,那这跟价格有毛线的关系。
<价格表>----货物ID---调额开始时间---结束时间----调额价
<销售表>----货物ID---销售数量---------销售金额-----销售时间.
这个你查询的时候直接查销售表就OK,跟价格表有关系么?设计有问题!
------解决思路----------------------
销售表必须直接记下价格、金额。

举例:
超时货架上看到货物a标价10元,放入购物车。
一小时后结账发现扫出来变成12元了,要求按标价结算。
所有实际结算价格不总是等于时段价格的。
  相关解决方案