要为公司设计一个比较简单的统计软件,公司的组织结构如下:
总部
区域分部1 区域分部2 .....
门店1 门店2 ... 门店3 门店4 ...
员工a 员工b ...............................
总部下设几个区域分部,每个区域分部下有若干门店,每个门店中有若干员工,
要可以分别统计员工,门店,区域,总部的某一时段的销售业绩。
在发生员工调动,比如从门店1调到门店2,或某个门店划到另个区域时,也要统计准确。
我想了好长时间了,不知到数据库如何设计比较合理。
总部
区域分部1 区域分部2 .....
门店1 门店2 ... 门店3 门店4 ...
员工a 员工b ...............................
总部下设几个区域分部,每个区域分部下有若干门店,每个门店中有若干员工,
要可以分别统计员工,门店,区域,总部的某一时段的销售业绩。
在发生员工调动,比如从门店1调到门店2,或某个门店划到另个区域时,也要统计准确。
我想了好长时间了,不知到数据库如何设计比较合理。
解决方案 »
- 请教一个写法?
- 有没有人能帮我解决一下这个问题,我很急的,应该很简单,举手之劳,谢谢大家。
- 〔至急求助〕SQL SERVER服务器信息完全备份方法
- 无法启动sql server
- 2 个问题
- 为什么查询分析器里面一些表打开后是可以修改数据,有些表却是只读的?
- 疑难sql问题请高手指教 (100分)
- 虚拟主机,安装程序时,sql数据库连接超时
- 安装程序配置服务器失败。参考服务器错误日志和c:\windows\sqlstp.log了解更多信息。
- 在Win2000Server上用SYBASE的OpenClient连SYBASE服务器,SQLEDIT里的参数应该怎么写?还有其它什么和Win98不同的?
- 有关win 2003中的网上邻居
- SQLserver2005
id name 其他字段
1 第1区域
2 第2区域门店表
id name 区域id(对应区域的ID) 其他字段
1 第1门店 1
2 第2门店 1
3 第3门店 2
员工表
id name 门店id(对应门店的ID) 其他字段
1 第1员工 1
2 第2员工 2
3 第3员工 1
4 第4员工 3
5 第5员工 1
6 第6员工 2然后三表根据相关字段关联并进行统计。
这种情况我做过
主要是营业员的归属需要两个表
一个是营业员信息表
一个是营业员信息快照表,快照以月归类
月份|ID|NAME|所属服营厅
其实说白了就是进销存来的。
第一个问题:可以分别统计员工,门店,区域,总部的某一时段的销售业绩区域部门的设计成树型结构,用一个表就可以了:
区域A
|__部门A1
|__部门A2
区域B
|__部门B1
|__部门B2 在销售单设计主、从表:
主表:制单日期、单号、客户、制单人、部门
从表:商品、单价、数量、仓库。员工就是当前的制单人,为了方便,把部门与员工对应起来,这样不管员工调到什么部门去,只要选择了部门,就自动把员工默认出来。
部门就关联到区域部门里去,这样在统计部门时,如果选择一级时,则把下一级统计出来,参看树型结构。第二次个问题:在发生员工调动,比如从门店1调到门店2,或某个门店划到另个区域时这个在第一个问题里已经说明了。这样做就可以实现的要求了。
我现在的最大的困惑不是统计当前的业绩,而是如果有变动的准确统计,比如2009年1月1日的状态
区域A
|__部门A1
|__员工1__员工2__员工3
|__部门A2
区域B
|__部门B1
|__部门B2 2009年3月15日到目前的状态区域A
|__部门A2
|__员工3区域B
|__部门A1
|__员工1__员工2
|__部门B1
|__部门B2 统计业绩时:
2009.1.1-2009.3.15日
部门A1及下属员工1、员工2、员工3的业绩计入区域A
2009.3.15-现在
部门A1及下属员工1、员工2业绩计入部门a1
员工3的业绩计入部门A2实际情况比这还要复杂些,头痛在这里
谢谢15楼,
我现在的最大的困惑不是统计当前的业绩,而是如果有变动的准确统计,比如2009年1月1日的状态
区域A
|__部门A1
|__员工1__员工2__员工3
|__部门A2
区域B
|__部门B1
|__部门B2 2009年3月15日到目前的状态区域A
|__部门A2
|__员工3区域B
|__部门A1
|__员工1__员工2
|__部门B1
|__部门B2 统计业绩时:
2009.1.1-2009.3.15日
部门A1及下属员工1、员工2、员工3的业绩计入区域A
2009.3.15-现在
部门A1及下属员工1、员工2业绩计入区域B
员工3的业绩计入区域A
实际情况比这还要复杂些,头痛在这里!!
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP
建议:
1)可以借鉴数据仓库建模理论中 SCD Type 2 的建模方法:在与时间变化有关的表里增加 Audit 字段。
2)可以参考 SQL Server 2008 实例数据库 AdventureWorksDW 中的建模方法,它们都遵守了实践证明是非常有效和规范的建模理论。
--测试数据 深度排序
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO
--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID PID Name
------ ------- ----------
002 001 烟台市
004 002 招远市
--*/ --测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
部门名称,店面名称,员工名称是必须唯一的,不管它的上级是谁,都可以用它来统计业绩.
部门ID,店面ID,员工ID是变化的,如一员工从一店面调到另一店面,员工名称不变,员工ID改变
只要增加一个字段---IsActived 如果为0则表示已调离(调离后原记录还在,并新增一记录,只是其所属店面ID已更改),
部门,店面,员工之间的上下级关系是通过ID来表示的,同样,销售记录也是通过ID来记录的,如果IsActived为0,则不再记录销售记录