对于每个SQL查询

时间:2009-09-22 09:13:17

标签: sql ms-access

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

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

我们有一个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  

例如,查询中的第一条记录显示在01/09/2009之前或之前预订到项目1234的所有小时数

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

正如评论所建议的那样,以基于集合的方式进行此操作将更加简单有效。在这里引起注意的主要事情是:

a)您可以在多个条件下加入

b)要获得time列中带有0的行,您将需要使用左连接(因为右表中没有记录),并使用ISNULL()将null转换为0

以下查询在SQL Server上有效:

--Set up for the example, you don't need this as you can access the permanend tables
DECLARE @HistoricalProjectData TABLE
    (
        ProjectCode int,
        Date        datetime
    )
INSERT INTO @HistoricalProjectData
VALUES
    (1234, '2009/09/01'),
    (9876, '2009/09/01'),
    (1234, '2009/09/07'),
    (9876, '2009/09/07')


DECLARE @SapData TABLE
    (
        ProjectCode int,
        Time        int,
        Date        datetime
    )
INSERT INTO @SapData
VALUES
    (1234, 2 , '2009/08/28'),
    (1234, 5 , '2009/08/29'),
    (9876, 10, '2009/09/02'),
    (1234, 2 , '2009/09/03')



--Replace the Table Variable names in here with the names of your tables.
SELECT
    his.ProjectCode,
    his.Date,
    SUM(ISNULL(sap.Time, 0))    AS  'TotalTime'

FROM
                @HistoricalProjectData  AS  his
    LEFT JOIN   @SapData                AS  sap ON  
                                                    sap.ProjectCode =   his.ProjectCode 
                                                AND 
                                                    sap.Date    <=  his.Date<=  his.Date

GROUP BY
    his.ProjectCode,
    his.Date

ORDER BY
    his.Date