Помогите составить запрос qRate_Period

dmitriy_po
Дата: 28.12.2015 21:40:11
Добрый день,
помогите, пожалуйста, в прикрепленной БД составить запрос qRate_Period.
Краткая справка. В запросе qPeriod есть перечень периодов Год - Месяц. В запросе qPeriod_Rate к каждому периоду необходимо подставить тариф (Rate), действующий в данном периоде. Тарифы находятся в таблице tRate. Год - Месяц в данной таблице означают период начала действия тарифа.
Запрос qPeriod_Rate составлен с использованием left join, все нулы необходимо заменить на тариф.

Заранее благодарен за помощь.
-Практикант-
Дата: 29.12.2015 00:00:04
dmitriy_po,
SELECT tYear.YEAR_, tMonth.MTH_NUM, tRate.RATE
FROM tRate, tMonth, tYear
WHERE tRate.YEAR_*100+tRate.MTH_NUM=(SELECT Max(t.YEAR_*100+t.MTH_NUM) FROM tRate As t 
      WHERE t.YEAR_*100+t.MTH_NUM<=tYear.YEAR_*100+tMonth.MTH_NUM)
ORDER BY tYear.YEAR_, tMonth.MTH_NUM

В данном случае запрос qPeriod не нужен.
dmitriy_po
Дата: 29.12.2015 00:56:07
-Практикант-
dmitriy_po,
SELECT tYear.YEAR_, tMonth.MTH_NUM, tRate.RATE
FROM tRate, tMonth, tYear
WHERE tRate.YEAR_*100+tRate.MTH_NUM=(SELECT Max(t.YEAR_*100+t.MTH_NUM) FROM tRate As t 
      WHERE t.YEAR_*100+t.MTH_NUM<=tYear.YEAR_*100+tMonth.MTH_NUM)
ORDER BY tYear.YEAR_, tMonth.MTH_NUM

В данном случае запрос qPeriod не нужен.


Благодарю за ответ.
А есть вариант с джоинами? Если чесно, то мне сложно разобраться в логике данного запроса, чтобы адаптировать его к моей рабочей базе. К тому же, поле Period мне необходимо.

Спасибо.
dmitriy_po
Дата: 29.12.2015 01:29:12
-Практикант-
dmitriy_po,
SELECT tYear.YEAR_, tMonth.MTH_NUM, tRate.RATE
FROM tRate, tMonth, tYear
WHERE tRate.YEAR_*100+tRate.MTH_NUM=(SELECT Max(t.YEAR_*100+t.MTH_NUM) FROM tRate As t 
      WHERE t.YEAR_*100+t.MTH_NUM<=tYear.YEAR_*100+tMonth.MTH_NUM)
ORDER BY tYear.YEAR_, tMonth.MTH_NUM

В данном случае запрос qPeriod не нужен.


Очень долго выполняется...
mds_world
Дата: 29.12.2015 03:18:09
dmitriy_po, посмотрите вариант. Таблица tRate изменена, добавлены начальный и конечный пределы интервалов в формате YYYYMM. Запрос qPeriod также изменен, добавлено поле P содержащее число формата YYYYMM. Выходной запрос qP. Этот запрос можно открывать только в SQL, в конструкторе он будет испорчен :-)
-Практикант-
Дата: 29.12.2015 06:39:23
dmitriy_po
А есть вариант с джоинами?

SELECT Z.YEAR_, Z.MTH_NUM, R.Rate
FROM (SELECT P.YEAR_, P.MTH_NUM, Max(R.Dat) As MaxDat
      FROM qPeriod As P INNER JOIN qRate As R ON P.Period>=R.Dat
      GROUP BY P.YEAR_, P.MTH_NUM) As Z
INNER JOIN qRate As R ON Z.MaxDat=R.Dat

где qRate запрос
SELECT DateSerial(YEAR_, MTH_NUM,1) AS Dat, RATE
FROM tRate
dmitriy_po
Дата: 29.12.2015 16:14:17
-Практикант-
dmitriy_po
А есть вариант с джоинами?

SELECT Z.YEAR_, Z.MTH_NUM, R.Rate
FROM (SELECT P.YEAR_, P.MTH_NUM, Max(R.Dat) As MaxDat
      FROM qPeriod As P INNER JOIN qRate As R ON P.Period>=R.Dat
      GROUP BY P.YEAR_, P.MTH_NUM) As Z
INNER JOIN qRate As R ON Z.MaxDat=R.Dat

где qRate запрос
SELECT DateSerial(YEAR_, MTH_NUM,1) AS Dat, RATE
FROM tRate


Благодарю за помощь! Все получилось.