Для каждого запроса SQL - PullRequest
       10

Для каждого запроса SQL

2 голосов
/ 22 сентября 2009

У нас есть база данных, которая содержит информацию о времени, забронированном для проектов. У нас есть оперативная запись для проекта, которая содержит правильную информацию о времени (импортируется из 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  

Так, например, первая запись в запросе показывает все часы, забронированные для проекта 1234, в период до 01.09.2009

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Похоже, что работает на основе предоставленных вами данных:

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 голосов
/ 22 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...