Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2016, 15:18   #1
REztor
Форумчанин
 
Регистрация: 28.02.2009
Сообщений: 302
По умолчанию Найти последнюю имеющуюся запись

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

Таблица покупок с указанием суммы валют t_pays
id date curr_id sum_qty
1 2011-04-04 1 5
2 2011-04-05 2 10
3 2011-04-06 3 20

таблица курсов валют по отношению к рублю t_course
id cur_id date curs
1 1 2011-04-04 1
2 2 2011-04-04 30
3 3 2011-04-04 40
4 1 2011-04-05 1
5 2 2011-04-05 30
6 3 2011-04-05 41
7 2 2011-06-06 28

таблица названий валют t_curr_name
id name
1 rur
2 usd
3 eur
REztor вне форума Ответить с цитированием
Старый 17.01.2016, 16:22   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Вложенный запрос надо делать. А еще лучше функцию написать, если субд позволяет.
come-on вне форума Ответить с цитированием
Старый 17.01.2016, 16:23   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

Код:
SELECT date, t_pays.summ_qty*t_course.curs AS sum_rur FROM t_pays
LEFT JOIN t_course ON (t_pays.curr_id = t_course.cur_id && t_pays.data=t_course.data)
GROUP BY t_pays.id
ORDER BY data DESC
LIMIT 1
без учета что если в этот день нет то последнуюю

Последний раз редактировалось ADSoft; 17.01.2016 в 16:25.
ADSoft вне форума Ответить с цитированием
Старый 17.01.2016, 16:32   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так не пойдет. Во вложенном найти макс дату не большую нужной и потом из записи с этой датой еще курс выдернуть. Еще хуже когда по одной дате больше одного куса, такого не встречал ибо не понятно что с ними делать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.01.2016, 16:03   #5
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

так пойдет??

Код:
SELECT t_curr_name.name, t_pays.sum_qty, 
  t_pays.data, t_course.data, t_course.curs, 
  t_pays.sum_qty*t_course.curs AS sum_rur
FROM t_curr_name, t_course, t_pays
WHERE t_course.cur_id=t_pays.curr_id And t_curr_name.id=t_pays.curr_id and 
  t_course.data =(SELECT max(t_course.data)
                       FROM t_course, t_pays
                       WHERE t_course.cur_id=t_pays.curr_id 
                       And t_pays.data>=t_course.data And t_pays.data=data1) 
and  t_pays.data=data1;
можно как нибудь передать параметр из внешнего запроса во внутренний??

типо такого
Код:
SELECT t_curr_name.name, t_pays.sum_qty, 
  t_pays.data AS data1, t_course.data, t_course.curs, 
  t_pays.sum_qty*t_course.curs AS sum_rur
FROM t_curr_name, t_course, t_pays
WHERE t_course.cur_id=t_pays.curr_id And t_curr_name.id=t_pays.curr_id and 
  t_course.data =(SELECT max(t_course.data)
                       FROM t_course, t_pays
                       WHERE t_course.cur_id=t_pays.curr_id 
                       And t_pays.data>=t_course.data And t_pays.data=data1)
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 18.01.2016 в 16:32.
Dvoishnik вне форума Ответить с цитированием
Старый 18.01.2016, 16:27   #6
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

зачем 2 раза по платежам гонять?

Цитата:
можно как нибудь передать параметр из внешнего запроса во внутренний??
Параметру вообще фиолетово где он. Дело не в параметре.

Последний раз редактировалось come-on; 18.01.2016 в 16:36.
come-on вне форума Ответить с цитированием
Старый 18.01.2016, 16:47   #7
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
зачем 2 раза по платежам гонять?
а как по другому то сделать??

Цитата:
Сообщение от come-on Посмотреть сообщение
Параметру вообще фиолетово где он. Дело не в параметре.
вы меня не правильно поняли. посмотрите внимательно пример который я привел

Код:
SELECT t_curr_name.name, t_pays.sum_qty, 
  t_pays.data AS data1, t_course.data, t_course.curs, 
  t_pays.sum_qty*t_course.curs AS sum_rur
FROM t_curr_name, t_course, t_pays
WHERE t_course.cur_id=t_pays.curr_id And t_curr_name.id=t_pays.curr_id and 
  t_course.data =(SELECT max(t_course.data)
                       FROM t_course, t_pays
                       WHERE t_course.cur_id=t_pays.curr_id 
                       And t_pays.data>=t_course.data And t_pays.data=data1)
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 18.01.2016, 17:00   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если внутренним соединением, то примерно так. Наименования валют не брал, не проблемно их присоединить
Код:
SELECT t_pays.date,t_pays.sum_qty*t_course.curs AS summ
  FROM t_pays,t_course
  WHERE t_course.cur_id=t_pays.curr_id AND
        t_course.date=(SELECT MAX(t.date)
                         FROM t_course t
                         WHERE t.cur_id=t_course.cur_id AND
                               t.date<=t_pays.date)
Но могут потеряться платежи, для валют которых вообще нет курса или минимальная дата курса больше даты платежа. Тогда только внешнее соединение через LEFT JOIN или вложенный запрос в вычисляемом поле и при отсутствии курса единичка вместо его
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.01.2016, 17:07   #9
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

не понят как это работать будет откуда взялась таблица t?
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 18.01.2016, 17:16   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почитайте про синонимы.
Код:
t_course t
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить последнюю запись согласно условию без VBA Shavminator Microsoft Office Excel 5 09.11.2014 20:26
Запрос на последнюю запись в столбце ins813 БД в Delphi 20 12.10.2012 15:05
переход на последнюю запись при открытии формы Ja-De Microsoft Office Access 2 18.01.2010 14:18
Как выбрать последнюю запись в таблице? Yur@ БД в Delphi 11 30.12.2009 18:11
Как найти последнюю запись в таблице? dsapa Microsoft Office Excel 2 21.07.2009 16:37