一个实际的应用问题

时间:2022-08-25 19:41:20
表结构 

公司表 Employer 
列名 类型 描述 
RowID        int           主键 
EmployerName Nvarchar(20)  公司名称 

计划年份 PlanYear 
列名           类型            描述 
RowID        int           主键 
PlanYearName Nvarchar(20) 年计划名称 

计划表    PlanInfo 
列名        类型            描述 
RowID      int       主键 
EmployerID int       公司编号 
PlanYearID int       计划年份标号 

计划时间表 PlanDates 
列名           类型            描述 
RowID        int        主键 
PlanInfoID   int        计划编号 
FactPlanDate DateTime   计划实际发生日期 


模拟数据 

RowID PlanInfoID FactPlanDate 
1        1        2008-7-1 
2        1        2008-7-8 
3        1        2008-7-15 
4        1        2008-7-22 


计划时间表                       PlanDateRules 
列名            类型                  描述 
RowID         int                 主键 
PlanInfoID    int                 计划编号 
Rule          Nvarchar(20)        规则类型(下边是类型说明) 
RuleDate1     Nvarchar(20)        规则1 
RuleDate2     Nvarchar(20)        规则2 

Employer表 代表公司,公司(EmployerID)每年都有相关的计划 存储在 PlanInfo 表 
每个计划(PlanInfoID) 由公司(EmployerID)和 计划年份(PlanYearID) 组成 
每个计划(PlanInfoID)的实际执行日期都会发生在 PlanDates表 里 , 
每个 (PlanDatesID)由 计划(PlanInfoID)和实际执行的时间组成. 
每个计划(PlanInfoID)都存在一种计划执行时间规则 PlanDateRules表 里 , 
每种计划执行时间规则(PlanDateRulesID)由 计划(PlanInfoID)和计划规则组成(Rule) 
RuleDate1(规则日期),RuleDate2(规则日期)组成。 

如果我叙述的不清晰,大家可以打开数据库关系图 

需求:这是一个水晶报表项目,需要显示某公司(EmployerID)某年份(PlanYearID)计划执行时间的实际计划执行时间。 
这个部分的功能,我已经完成了,我是通过函数生成 计划执行日期(PlanDateRulesID)和实际执行日期查询的结果进行连接。 
Sql脚本中包含一个存储过程和5个方法,去完成以上功能。 

现在的客户需求发生了变化,在查询中加入了 {全部}条件,这个是比较头痛的事情,在两个条件都选择All的时候(PlanYearID, EmployerID),需要查询的结果是两个字段笛卡尔积的结果去执行我的存储过程。 
但这样效率实在太慢,而且我的办法也很笨,本人的数据库的基础很差,希望高手能给些指点。 

查询条件 为 ALL的时候, PlanYearID, EmployerID 为全部 的迪卡积极集合 在去执行,我写的存储过程。 
我想要一种高效的方式。

谢谢大家 

测试数据脚本 地址
http://topic.csdn.net/u/20080821/10/5162083c-87d3-43c5-9519-06c5a1712262.html




Rule字段(类型说明) 
Weekly,Semi-Monthly,Monthly-Date,Monthly-Day of Week, Manual. 在系统中, 
每当选择不同的种类时,会有相应的dropdownList 显示出1个或者两个供选的字段。如 
果出现一个dropdownlist,那个这个值在TBL_PlanDateRules. RuleDate1中, 如果出现 
两个: 第一个的值在TBL_PlanDateRules. RuleDate1中,第二个在 
TBL_PlanDateRules. RuleDate2中。  数据库表中的值跟Dropdownlist里的textvalue 
一样。 

当选择Weekly的时候,右边会出现一个Dropdownlist,里边有周一到周五供选择。这就 
是说从这个Planyear的1月1日开始找所有的星期X(x是在Dropdownlist里选择的,也就 
是TBL_PlanDateRules. RuleDate1)。 

当选择Semi-Monthly的时候,右边会出现两个Dropdownlist,前一个 是上半月的日 
期,后一个是下半月的日期。注意下半月最后一项是last,代表本月最后一天。  这就 
要列出,本Planyear中每个月份的这两天。 

当选择Monthly-Date的时候,右边是一个Dropdownlist,里边是日期。这就要列出,本 
Planyear中每个月份的这一天。 

当选择Monthly-Day of Week的时候,右边会出现两个Dropdownlist, 意思是要在每个 
月选择一天,这一天是第几周的周几。 所一第一个Dropdownlist表示的是要选择第几 
周,后一个是表示周几。所以报表就要列出,本Planyear中每个月份的这一天。 

当选择Manual的时候, 计划日期同FactPlanDate 

11 个解决方案

#1


好长

#2


好长..

#3


好长......

#4


好长
楼主精简下,说问题的关键~~~

#5


引用 4 楼 wufeng4552 的回复:
好长
楼主精简下,说问题的关键~~~


归纳一下!

#6


现在的客户需求发生了变化,在查询中加入了 {全部}条件,这个是比较头痛的事情,在两个条件都选择All的时候(PlanYearID, EmployerID),需要查询的结果是两个字段笛卡尔积的结果去执行我的存储过程。 
但这样效率实在太慢,而且我的办法也很笨,本人的数据库的基础很差,希望高手能给些指点。 

查询条件 为 ALL的时候, PlanYearID, EmployerID 为全部 的迪卡积极集合 在去执行,我写的存储过程。 
我想要一种高效的方式。

#7


顶顶

#8


顶顶

#9


等待高手出现。。

#10


如果ALL=原来的两部分之和
那你可以用union把两个结果联合起来返回给用户
时间就是两部分执行的时间之和了

如果不等,我也不知道怎么做了
等高手出现

#11


如果不等,我也不知道怎么做了 
等高手出现

#1


好长

#2


好长..

#3


好长......

#4


好长
楼主精简下,说问题的关键~~~

#5


引用 4 楼 wufeng4552 的回复:
好长
楼主精简下,说问题的关键~~~


归纳一下!

#6


现在的客户需求发生了变化,在查询中加入了 {全部}条件,这个是比较头痛的事情,在两个条件都选择All的时候(PlanYearID, EmployerID),需要查询的结果是两个字段笛卡尔积的结果去执行我的存储过程。 
但这样效率实在太慢,而且我的办法也很笨,本人的数据库的基础很差,希望高手能给些指点。 

查询条件 为 ALL的时候, PlanYearID, EmployerID 为全部 的迪卡积极集合 在去执行,我写的存储过程。 
我想要一种高效的方式。

#7


顶顶

#8


顶顶

#9


等待高手出现。。

#10


如果ALL=原来的两部分之和
那你可以用union把两个结果联合起来返回给用户
时间就是两部分执行的时间之和了

如果不等,我也不知道怎么做了
等高手出现

#11


如果不等,我也不知道怎么做了 
等高手出现