2009-09-22 2 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 окутано в проект 1234, не позднее 01/09/2009

+0

Игнорирование люди говорят курсоры плохо. Они просто этого не понимают. Если они пытаются забить гвоздь в стену с помощью сверла, это не ошибка сверла. –

+0

Хотя я бы не сказал: «Никогда не используйте курсор, если это абсолютно необходимо», очень важно получить привычку к логике и мышлению на основе набора. Ошибочно, что многие всегда обращаются к циклам, курсорам и процессуальному мышлению, когда простой простой набор-запрос может решить проблему простым, простым и быстрым способом. –

+0

Это как раз то, что делать с Access? –

ответ

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

Это отлично поработало, спасибо –

0

Это всего лишь инструкция SELECT (с соединением без equi). Я рекомендую изучить базовые концепции SQL, прежде чем пытаться выполнить разработку базы данных.

+0

Ну, это не совсем так, потому что соединение должно быть в коде проекта, и мне нужно получить эти данные для каждого кода проекта в таблице исторических данных, что усложняет его. –

+0

Ничто не мешает вам использовать условие объединения, например ... FROM JOIN b ON b.date erikkallen

Смежные вопросы