Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在数据库中存储每周目标_Sql Server_Database_Database Design_Relational Database - Fatal编程技术网

Sql server 在数据库中存储每周目标

Sql server 在数据库中存储每周目标,sql-server,database,database-design,relational-database,Sql Server,Database,Database Design,Relational Database,我有以下要求 Sales Officer: Bob Week1 Week2 Week3 ................. Week52 Prod1 10 15 12 ................. 14 Prod2 20 14 10 ................. 17 .

我有以下要求

Sales Officer: Bob

             Week1 Week2  Week3 ................. Week52
    Prod1     10    15    12    .................    14
    Prod2     20    14    10    .................    17
    .                                                 .   
    .                                                 .
    .                                                 .
销售主管将每周为每位销售人员设定目标。 销售专员可以通过类似的表格,对照设定的目标,例如
编辑
在上述情况下,主管已经为第一周设定了10个单位的目标,现在销售专员将每日的销售额输入为1,2,0,1,3,2=9(第一周的实际销售额),因此,相对于10个单位的目标,他在第一周售出了9个单位。

我已经创建了员工表和产品表。关于如何将存储在数据库中的最佳实践,是否有任何指南可供参考,以存储目标并记录实际销售额

我正在考虑将数据存储在下表中

EmpSales (EmployeeID,ProductID,SaleTarget,Actual Sale,Date,WeekNo,Month)

提前感谢

就我个人而言,我会选择一个更通用的“周期”表

周期(周期ID、开始日期、结束日期、周、月、年)

然后加上

empSales(员工ID、产品ID、销售目标、实际销售额、周期ID)

这有点灵活(您可以很容易地引入不同的时间跨度,或者将相对周字段设置为空,或者定义一些将周期映射到“标准”周的规则),冗余更少(注意如何将月和周从empSales表中移出),并且允许您进行报告和计算(顺便说一句,您没有包含年份字段,有原因吗?)

统计数据应该更容易,因为假设您有按天排序的销售数据,除非您想在整个数据库中复制“week”字段,否则在间隔之间对这些数据进行汇总就更容易了

还请注意,您可以很容易地在不同的重叠时段设置目标

例如,您可以为11月22-28日设定每周目标(我使用的是周一开始的欧洲惯例),并在黑色星期五设定一天的特殊期限

因此:

请注意,员工567689如何未达到每周目标,但却设法超过了黑色星期五的目标

顺便说一句,在处理这个示例时,我认为您最好删除“empSales”表,将其重命名为“empTargets”:

EmptTargets(EmployeeId、ProductId、SaleTarget、periodId)

因为实际销售额很容易通过自定义项或视图进行动态计算——毕竟,这只是一个简单的过程

select sum(items_sold) 
from sales 
where sales.employeeId = empTargets.employeeId and 
      sales.ProductId= empTargets.ProductId and 
      sales.saleDate between empTargets.startDate and 
                             empTargets.endDate)

因此,无需将其直接存储在表中(事实上,在返回项目或其他未来更正的情况下,它可能会成为负担)。

个人而言,我会选择更通用的“期间”表

周期(周期ID、开始日期、结束日期、周、月、年)

然后加上

empSales(员工ID、产品ID、销售目标、实际销售额、周期ID)

这有点灵活(您可以很容易地引入不同的时间跨度,或者将相对周字段设置为空,或者定义一些将周期映射到“标准”周的规则),冗余更少(注意如何将月和周从empSales表中移出),并且允许您进行报告和计算(顺便说一句,您没有包含年份字段,有原因吗?)

统计数据应该更容易,因为假设您有按天排序的销售数据,除非您想在整个数据库中复制“week”字段,否则在间隔之间对这些数据进行汇总就更容易了

还请注意,您可以很容易地在不同的重叠时段设置目标

例如,您可以为11月22-28日设定每周目标(我使用的是周一开始的欧洲惯例),并在黑色星期五设定一天的特殊期限

因此:

请注意,员工567689如何未达到每周目标,但却设法超过了黑色星期五的目标

顺便说一句,在处理这个示例时,我认为您最好删除“empSales”表,将其重命名为“empTargets”:

EmptTargets(EmployeeId、ProductId、SaleTarget、periodId)

因为实际销售额很容易通过自定义项或视图进行动态计算——毕竟,这只是一个简单的过程

select sum(items_sold) 
from sales 
where sales.employeeId = empTargets.employeeId and 
      sales.ProductId= empTargets.ProductId and 
      sales.saleDate between empTargets.startDate and 
                             empTargets.endDate)

因此,无需将其直接存储在表中(事实上,在返回项目或其他未来更正的情况下,它可能会成为负担)。

我个人会将目标和实际值存储在单独的行中,并且很可能存储在单独的表中:

目标: EmployeeId、PeriodId、ProductId、TargetValue

销售: EmployeeId、PeriodId、ProductId、SalesValue

事实上,在集成系统中,第二个表通常是不必要的(假设您有一个完整的销售记录系统,这应该是实际记录销售额的投影/视图-根据该子系统的模型适当分配员工、期间和产品)

为了满足您的日历要求,我几乎肯定会有一个日期表,它将允许您确保在没有复杂日期逻辑的情况下为周和月定义所有不同的业务规则。然后通过与日历表的联接来方便确定期间和聚合

因此,实际销售情况如下所示(只有一个通用的周期表,它本身可能是一个周期和日期表):

这将预先填充您要报告的各个时段:

'Q', 1/1/2010, 4/1/2010
'M', 1/1/2010, 2/1/2010
'M', 2/1/2010, 3/1/2010
'M', 3/1/2010, 4/1/2010
'W', 1/3/2010, 1/10/2010
'W', 1/10/2010, 1/17/2010
etc.
'D', 1/1/2010, 1/2/2010
'D', 1/2/2010, 1/3/2010
etc.
担心假期是没有什么意义的,只是如果假期不起作用,你可能不会指定目标,这主要是为了管理任务,使它们看起来很现实。你可以有一个带有各种标志的日历日表

Calendar
DateId
Date
IsHoliday
然后,您可以在加入时计算一段时间内的假期/周末数等

这是一个典型的会计/商业问题,但你可能需要考虑将你的日历标准化。例如,在电视广告的媒体购买中,他们使每个“季度”相等,并使每个“月”标准化——4周、4周、5周。显然,他们对假日和特殊电视活动例外,但这有助于使你的工作顺利进行
'Q', 1/1/2010, 4/1/2010
'M', 1/1/2010, 2/1/2010
'M', 2/1/2010, 3/1/2010
'M', 3/1/2010, 4/1/2010
'W', 1/3/2010, 1/10/2010
'W', 1/10/2010, 1/17/2010
etc.
'D', 1/1/2010, 1/2/2010
'D', 1/2/2010, 1/3/2010
etc.
Calendar
DateId
Date
IsHoliday