2013-10-02 4 views
0

У меня есть две таблицы базы данных Microsoft Access. Они называются Historical_Stock_Prices и Balance_Sheets. Мне нужно объединить данные из каждой из этих таблиц, чтобы создать таблицу с именем Daily. Мне нужно взять поля Ticker, [Date] и [Close] от Historical_Stock_Prices и мне нужно снять поле Common_Stocks от Balance_Sheets.MS Access SQL Select Statement из двух таблиц

Я не буду брать каждый ряд из Historical_Stock_Prices и Balance_Sheets. Я буду брать строки, которые находятся или до даты, выбранной в DateTimePicker с именем dtpDateSelection.

Теперь основная проблема, что у меня есть, заключается в том, что Historical_Stock_Prices содержит строку для каждого дня. Пока Balance_Sheets содержит строку за каждый квартал. Так что за каждый день за квартал фигура Common_Stocks фигура, которая исходит от Balance_Sheet, будет такой же.

Как это сделать?

Вот код, который я до сих пор:

Dim Date1 As Date = dtpDateSelection.Value 
Dim cmd As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] = " & Date1 & "", con) 
cmd.ExecuteNonQuery() 

Это, очевидно, не включает в себя таблицу Balance_Sheet вообще. Кроме того, в настоящее время мой оператор where выдает ошибку.

Дополнительная информация: Таблица Schema

Balance_Sheet Schema

Historical_Stock_Prices Schema

+1

Как связаны Historical_Stock_Prices и Balance_Sheets? У них есть первичный/внешний ключ? Если у них нет первичного/внешнего ключа, то я предполагаю, что они связаны через поле Quarter and Year. – Linger

+0

@Linger Они не связаны. Я не уверен, что лучший способ связать их. 'Historical_Stock_Prices' имеет первичный ключ из двух полей. Это «Тикер» и «Дата». 'Balance_Sheets' имеет первичный ключ из трех полей. Это «Тикер», «Год» и «Период». – gromit1

ответ

2

Inner присоединиться на четверть, что Historical_Stock_Prices и Balance_Sheets имеют в общем. То есть каждая дата приходится на четверть. Если у параметра Balance_Sheets есть поле с именем Period, которое является числом 1, 2, 3 или 4, которое соответствует каждому кварталу в году, и у вас есть поле Year, которое представляет собой 4-значное число, тогда этот запрос выбора должен работать и может быть легко преобразован в запрос таблицы make.

select Ticker, Date, Close, Common_Stocks 
from Historical_Stock_Prices, Balance_Sheets 
where Format(Historical_Stock_Prices.Date, "q") = Balance_Sheets.Period 
     and Year(Historical_Stock_Prices.Date) = Balance_Sheets.Year 
+0

Предлагаемый код вернул это сообщение об ошибке 'Дополнительная информация: Не удается найти таблицу или ограничение.' – gromit1

+1

У вас есть поле в Balance_Sheets с именем Quarter или что-то эквивалентное ему? Я вижу, что вы упомянули поля Year and Period выше. Период представляет собой четверть (например, имеет значение 1, 2, 3 или 4)? –

+0

Я изменил 'Balance_Sheets.Quarter' на' Balance_Sheets.Period', но я все равно получаю ту же ошибку. – gromit1

2

Создать запрос прочь Historical_Stock_Prices который включает в себя 2 новые поля, квартал и год, с соответствующими функциями, чтобы тянуть эти значения с даты строки. Затем присоедините свои две таблицы, используя эти поля. Ваше окончательное утверждение в VB должно идти против этого запроса.

Что касается того, почему вы получаете ошибку в инструкции SQL, у вас нет # вокруг параметра.

Dim cmd As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] = #" & Date1 & "#", con) 

Обратите внимание, что это по-прежнему плохая форма и просто ждет атаки SQL Injection. BEst посмотреть, как использовать параметризованные запросы.

+0

Спасибо за предложение. Я буду работать над этим. Я ранее пытался использовать параметризованный запрос, но я тоже получал ошибку. Вот что я имел: 'SELECT Ticker, [Date], [Close] From Historical_Stock_Prices WHERE [Date] =?", Con) cmd.Parameters.AddWithValue ("?", Date1) ' – gromit1

+1

Обычно лучше использовать что-то вроде это 'cmd.Parameters.Add (« @ Date », OleDbType.Date) .value = Date1' – APrough

2
"SELECT [H].[Ticker], [H].[Date], [H].[Close], [B].[Common_Stocks] 
FROM [Historical_Stock_Prices] AS [H], [Balance_Sheets] AS [B] 
WHERE [H].[Ticker] = [B].[Ticker] 
AND Int(Format([H].[Date],'Q')) = Int([B].[Period]) 
AND Int(Year([H].[Date])) = Int([B].[Year]) 
AND [H].[Date] <= #" & Date1.value & "#" 
+0

« Период »является числовым. Я получил эту ошибку, хотя« Дополнительная информация: не удается найти таблицу или ограничение ». – gromit1

+1

вынуть 'ON Year (H.Date) = B.Year' и' AND Format (H.Date, 'Q') = B.Period' и change 'AND H.Ticker = B.Ticker' to' ON H.Ticker = B.Ticker' и попробуйте просто посмотреть, не получится ли у вас такая же ошибка – Linger

+0

У меня такая же ошибка – gromit1

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