Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.01.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
6-1274355825
amelnyk
2010-05-20 15:43
2015.01.25
Unzip SOAP response


3-1302158824
OW
2011-04-07 10:47
2015.01.25
Почему дольше стало выполняться? oracle


2-1387813903
Gedimen
2013-12-23 19:51
2015.01.25
FireBird запрос к нескольким таблицами


2-1387969962
aka
2013-12-25 15:12
2015.01.25
if then


15-1402790532
Пит
2014-06-15 04:02
2015.01.25
Термодинамика отдельно взятого человека





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский