Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.01.25;
Скачать: CL | DM;

Вниз

FireBird запрос к нескольким таблицами   Найти похожие ветки 

 
Gedimen ©   (2013-12-23 19:51) [0]

Доброго времени суток, господа форумчане.
Firebird 2.5 , Delphi XE5

Есть три таблицы:
t1 - виды тарифов;
t2 - цены тарифа и порядок образования цены (фиксированная, рассчитывается по базе и процентом от базы, вносятся на дату! (подчинена t1);
t3 - таблица с перечислениями: фиксированная, рассчитывается по базе, процентом от базы (значения используются в t2).

Собственно проблема в запросе к базе данных firebird. Уже всю голову сломал.

Нужно получить список всех тарифов (таблица t1) с последней ценой на дату (t2) и со значением порядка образования цены (t3).

t1.fname - наименование,
t2.fval    - цена,
t2.fdate  - дата значения,
t3.fname_val - порядок образования

SELECT t1.fname, t2.fval, t3.fname_val
FROM t1 LEFT JOIN t2 ON t2.id_t1 = t1.id LEFT JOIN t3 ON t3.id = t2.id_t3 WHERE t2.fdate<="31.12.2013"


В итоге получается примерно такая фигня:
Вид тарифа         Цена        Порядок образования цены
Тариф1              10,00        фиксированной суммой
Тариф1              12,00        фиксированной суммой
Тариф2              5,00         Расчет по базе
Тариф3              7,00         Расчет по базе
Тариф3              12,00        фиксированной суммой

Должна быть одна запись по каждому тарифу, т.е. последнее значение на дату. Может быть к t2 FIRST прикрутить можно?
Помогите, пожалуйста!


 
anonims   (2013-12-24 09:22) [1]


> одна запись по каждому тарифу, т.е. последнее значение на
> дату.

select max(t2.date), t2.id from t2 group by t2.id

select t2.val, t2.date, t2.name from t2
inner join (select max(t2.date), t2.id from t2 group by t2.id ) as last
on last.id =t2.id and last.date =t2.date


select t1.* ,  
( select first 1 t2.name from t2 where t2.id =t1.id and t2.date<fixdate order by t2.date desc) as lastname,
( select first 1 t2.fdate from t2 where t2.id=t1.id and t2.date<fixdate  order by t2.date desc) as lastdate
from t1 .....


 
sniknik ©   (2013-12-24 09:48) [2]

так не получится (fb поддерживает)?
SELECT t1.fname, t2.fval, t3.fname_val
FROM (SELECT id_t1, Max(fdate) AS fdate FROM t2 WHERE fdate<="31.12.2013" GROUP BY id_t1, fdate) AS t4
LEFT JOIN t1 ON t4.id_t1 = t1.id
LEFT JOIN t2 ON t4.id_t1 = t2.id AND t4.fdate = t2.fdate
LEFT JOIN t3 ON t2.id_t3 = t3.id


 
sniknik ©   (2013-12-24 09:50) [3]

а, ну да, fdate в GROUP BY лишний, нужен только id_t1.


 
Gedimen ©   (2013-12-24 14:08) [4]

Сделал так. А как по скорости такой запрос, а то есть сомнения?
SELECT t1.fname, t2.fval, t3.fname_val
FROM t1 LEFT JOIN t2 ON t2.id_t1=t1.id
LEFT JOIN t3 ON t3.id = t2.id_t3
WHERE t2.id = (SELECT FIRST 1 id FROM t2
WHERE id_t1 = t1.id AND t2.fdate<="31.12.2013")


 
sniknik ©   (2013-12-24 15:43) [5]

есть сомнения в правильности его работы... а в скорости сомнений нет, это будет самый медленный из возможных вариантов... ИМХО (не представляю как, но верю, что смогут и медленнее)


 
Gedimen ©   (2013-12-24 16:02) [6]

Спасибо. Сделаю как во втором ответе.



Страницы: 1 вся ветка

Текущий архив: 2015.01.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
2-1388401221
Вопрошающий
2013-12-30 15:00
2015.01.25
E2089 Invalid typecast


15-1403446108
Timer
2014-06-22 18:08
2015.01.25
Посоветуйте аудио-плеер


15-1403595384
XCoder
2014-06-24 11:36
2015.01.25
Выбор между FireMonkey vs VCL


15-1403553301
KilkennyCat
2014-06-23 23:55
2015.01.25
.Net webbrowser


6-1274355825
amelnyk
2010-05-20 15:43
2015.01.25
Unzip SOAP response