2015-07-31 4 views
0

Я пытаюсь написать один запрос, используя 3 таблицы.
Таблицы и их столбцы, которые я буду использовать, являются:SQL получение средних значений с несколькими объединениями

Sec – ID, Symbol 
Hss – Code, HDate, Holiday 
Fddd – ID, Date, Price 

Учитывая символ AAA, мне нужно, чтобы получить ID из первой таблицы и сопоставить его с идентификатором из третьей таблицы. Дата второй таблицы должна соответствовать датам третьей таблицы с условием Code=1 и Holiday=1.

Даты во второй и третьей таблице находятся в порядке возрастания с самыми последними датами внизу. Я хочу получить средние цены 50 day и 200 day. Даты в таблицах находятся в порядке возрастания, поэтому я хочу, чтобы они спускались и выбирали top 50 и 200, чтобы получить средние цены.

До сих пор я могу получить только одно среднее. Я не могу добавить второй SELECT TOP 50 или добавить subquery в течение второго avg().

SELECT AVG(TwoHun)TwoHunAvg --, AVG(Fifty) AS FiftyAvg 
FROM (SELECT TOP 200 Fddd.price AS TwoHun --, TOP 50 Fddd.price AS Fifty 
FROM Sec 
JOIN Fddd 
ON Sec.ID = Fddd.ID AND Sec.symbol = 'AAA' 
JOIN Hss 
ON Fddd.date = Hss.Hdate AND Hss.Code = 1 AND Hss.Holiday = 1 
ORDER BY Fddd.Date DESC) AS tmp; 

Заранее благодарен!

+0

Возможно, вы захотите упомянуть базу данных, которую вы используете. – mustaccio

+0

Это также поможет получить образцы данных для тестирования! Также ваш вопрос немного запутанный, пожалуйста, укажите 2 таблицы. Один с данными и один с тем, что вы хотите в качестве результатов. –

+0

@mustaccio Я думаю, что это ms доступ или SQL-сервер. Ссылка: http://www.w3schools.com/sql/sql_top.asp –

ответ

0

Я подозреваю, что вы используете SQL Server или MS Access.

Одним быстрым решением было бы получить ваш общий запрос в качестве подзапроса, а затем скопировать измененную версию в качестве второго подзапроса.

Быстрый грубый пример:

SELECT (SELECT 
     AVG(Fifty) AS FiftyAvg 
     FROM (SELECT TOP 50 
     Fddd.price AS Fifty 
     FROM Sec 
     JOIN Fddd 
     ON Sec.ID = Fddd.ID 
     AND Sec.symbol = 'AAA' 
     JOIN Hss 
     ON Fddd.date = Hss.Hdate 
     AND Hss.Code = 1 
     AND Hss.Holiday = 1 
     ORDER BY Fddd.Date DESC) AS tmp) 
     AS FiftyAvg, 
     (SELECT 
     AVG(TwoHun) TwoHunAvg 
     FROM (SELECT TOP 200 
     Fddd.price AS TwoHun 
     FROM Sec 
     JOIN Fddd 
     ON Sec.ID = Fddd.ID 
     AND Sec.symbol = 'AAA' 
     JOIN Hss 
     ON Fddd.date = Hss.Hdate 
     AND Hss.Code = 1 
     AND Hss.Holiday = 1 
     ORDER BY Fddd.Date DESC) AS tmp) 
     AS TwoHundredAverge; 
+0

Я исправлю, что этот запрос предполагает, что 'Dual' - это сохраненная таблица в базе данных одной записи? – Parfait

+0

Фактически двойное - это ключевое слово фиктивной таблицы. Фактические запросы - это подзапросы –

+0

На самом деле ссылка на двойную таблицу не требуется, ссылка: http://stackoverflow.com/a/28371433/1688441 –

0

Рассмотрим запрос союза, который даже весы для других средних. Я добавляю столбец типа, чтобы указать Средние.

SELECT '200 DAY AVG' As Type, AVG(TwoHun) As Avg 
FROM 
    (SELECT TOP 200 Fddd.price AS TwoHun 
    FROM Sec 
    INNER JOIN Fddd ON Sec.ID = Fddd.ID 
    INNER JOIN Hss ON Fddd.date = Hss.Hdate 
    WHERE Sec.symbol = 'AAA' AND Hss.Code = 1 AND Hss.Holiday = 1 
    ORDER BY Fddd.Date DESC) AS tmp; 

UNION 

SELECT '50 DAY AVG' As Type, AVG(FiftyHun) As Avg 
FROM 
    (SELECT TOP 50 Fddd.price AS FiftyHun 
    FROM Sec 
    INNER JOIN Fddd ON Sec.ID = Fddd.ID 
    INNER JOIN Hss ON Fddd.date = Hss.Hdate 
    WHERE Sec.symbol = 'AAA' AND Hss.Code = 1 AND Hss.Holiday = 1 
    ORDER BY Fddd.Date DESC) AS tmp; 

Кроме того, я переместил некоторые из ваших выражений присоединения в предложение where, которое не должно изменять производительность, но делает его читабельным.

+0

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

+0

Правильно, следовательно, «рассмотрим». Вы избили меня до первоначального запроса. Я предоставляю альтернативу OP и, возможно, будущим читателям. И 100-дневный, 30-дневный, 15-дневный может быть добавлен для набора данных Avgs. Кроме того, есть аспект производительности четверных и двойных подзапросов ... – Parfait