2009-09-22 92 views
2

我们有一个数据库,其中包含有关项目预订时间的信息。我们有一个项目的实时记录,它包含正确的时间信息(每周从SAP导入一次)。对于每个SQL查询

我们也有存档记录显示在某个时间点的时间信息,这些记录每周进行一次,基本上是快照。 用户以后可能会提出调整项目时间的请求。如果发生这种情况,实时记录将反映项目的正确时间,但快照不会。 我需要编写一个查询,并在此时使用正确的项目时间更新这些快照。

我们有一个SAP数据表,它包含项目的每个时间条目的记录,显示项目代码的用途,日期和时间。历史数据表包含项目的代码和拍摄快照的日期。 因此,我需要编写一个将通过历史数据表的SQL查询,并且对于每一行,通过查看SAP表并在获取快照日期之前获取所有时间代码,获取该项目代码所花费的时间。

我真的很难做到这一点在一个SQL查询,主要问题是我真的需要运行历史数据表中的每个记录查询。我不断地提出建议使用游标的页面,但我对它们不甚了解,并不断看到文章说它们不好。任何关于我可以使用哪种查询的建议都会很棒!

基本上我想要的伪做的是:

For Each Project Code in the hostorical data table, archived on a date, select all time entrys on or before that date. 

示例表

Historical Project Data       SAP Data 
-----------------------      ---------------- 
Project Code | run date      Project Code | Time | Date 
1234   | 01/09/2009      1234   | 2 | 29/08/2009 
9876   | 01/09/2009      1234   | 5 | 29/08/2009 
1234   | 07/09/2009      9876   | 10 | 02/09/2009 
9876   | 07/09/2009      1234   | 2 | 03/09/2009 

所以我想用一个查询,显示

Project Code | run date | time 
1234   | 01/09/2009 | 7      
9876   | 01/09/2009 | 0      
1234   | 07/09/2009 | 9      
9876   | 07/09/2009 | 10 
落得

因此,例如,查询中的第一条记录显示所有小时b在2009年9月1日或之前开始项目1234。

+0

忽略别人说游标是坏的。他们只是不明白。如果他们试图用钻头将钉子钉入墙上,那不是钻头的缺点。 – 2009-09-22 09:19:27

+0

虽然我不会说'绝对不需要使用游标',但要养成基于集合的逻辑和思维的习惯是非常重要的。当一个非常简单的基于集合的查询能够以简单,简单和快速的方式解决问题时,总是直接进入循环,游标和程序思维是很多错误。 – 2009-09-22 12:03:26

+0

这恰恰与Access有关? – 2009-09-23 01:51:59

回答

1

这似乎工作基于数据您提供:

create table #historical_project 
(project_code int 
,run_date datetime 
) 

create table #sap 
(project_code int 
,time_val int 
,date datetime 
) 

insert #historical_project 
     select 1234,'20090901' 
union select 9876,'20090901' 
union select 1234,'20090907' 
union select 9876,'20090907' 

insert #sap 
     select 1234,2 , '20090829' 
union select 1234,5 , '20090829' 
union select 9876,10, '20090902' 
union select 1234,2 , '20090903' 


SELECT * 
     ,(SELECT ISNULL(SUM(time_val),0) 
      FROM #sap    AS sp 
      WHERE hp.project_code = sp.project_code 
      AND hp.run_date  >= sp.DATE 
     ) AS time 
FROM #historical_project AS hp 
ORDER BY run_date 
     ,project_code 
+0

这很好,谢谢 – 2009-09-22 13:57:41

0

这只是一个SELECT语句(使用非等连接)。我建议在尝试进行数据库开发之前学习基本的SQL概念。

+0

那么这不完全正确,因为连接需要在项目代码上,我需要为历史数据表中的每个项目代码获取此数据,这使其复杂化 – 2009-09-22 09:46:23

+0

没有什么阻止您使用连接条件,如... FROM a JOIN b ON b.date erikkallen 2009-09-22 16:38:53