我们有一个数据库,其中包含有关预订项目的时间的信息。我们有一个项目的实时记录,其中包含正确的时间信息(每周从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的所有小时数
答案 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