Выберите одну из двух таблиц, чтобы узнать ставку НДС на дату вступления в силу.

У меня есть две таблицы:

mysql> desc vat_rates;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| rate_id     | varchar(5)    | NO   | PRI | NULL    |       |
| name        | varchar(255)  | NO   |     | NULL    |       |
| type        | enum('O','I') | NO   |     | NULL    |       |
| default     | tinyint(1)    | YES  |     | 0       |       |
+-------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> desc vat_rates_details;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| rate_id     | varchar(10) | NO   |     | NULL    |       |
| effect_date | date        | NO   |     | NULL    |       |
| rate        | float       | NO   |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Мне нужен запрос, который дает мне vat_rates.name, vat_rates.rate_id, vat_rates_details.rate ГДЕ effect_date равен MAX (), но ‹=, чем now ().

Для упрощения, мне нужно выбрать все vat_rates с полем ставки, являющимся последней датой на основе effect_date, но не в будущем.

Пример с данными:

vat_rates:
rate_id = 'L9'
name = 'MyVatName'
type = 'O'
по умолчанию = 1

vat_rates_details (строка 1):
rate_id = 'L9'
effect_date = '2000-01-01'
rate = 20

vat_rates_details (строка 2):
rate_id = 'L9'
effect_date = '2010-06-01'
rate = 19

vat_rates_details (строка 3):
rate_id = 'L9'
effect_date = '2010-07-01'
rate = 21

Ожидаемый результат:

+-------------+-------------+------+
| rate_id     | name        | rate |
+-------------+-------------+------+
| L9          | MyVatName   | 19   |
+-------------+-------------+------+

Спасибо за ваше время :)

РЕДАКТИРОВАТЬ: Ожидаемая оценка - 19, а не 20. Спасибо Джастину.


person mjsilva    schedule 29.06.2010    source источник
comment
разве вы не ожидаете 19 баллов вместо 20?   -  person Justin Giboney    schedule 29.06.2010


Ответы (2)


Другие возможные методы:

SELECT
    VR.name,
    VR.rate_id,
    VRD1.rate
FROM
    Vat_Rates VR
INNER JOIN Vat_Rate_Details VRD1 ON
    VRD1.rate_id = VR.rate_id AND
    VRD1.effect_date < NOW()        -- Is this the correct syntax for mySQL?
LEFT OUTER JOIN Vat_Rate_Details VRD2 ON
    VRD2.rate_id = VR.rate_id AND
    VRD2.effect_date < NOW() AND
    VRD2.effect_date > VRD1.effect_date

SELECT
    VR.name,
    VR.rate_id,
    VRD1.rate
FROM
    Vat_Rates VR
INNER JOIN Vat_Rate_Details VRD1 ON
    VRD1.rate_id = VR.rate_id AND
    VRD1.effect_date < NOW()
WHERE NOT EXISTS
(
    SELECT *
    FROM Vat_Rate_Details VRD2
    WHERE
        VRD2.rate_id = VR.rate_id AND
        VRD2.effect_date < NOW() AND
        VRD2.effect_date > VRD1.effect_date
)
person Tom H    schedule 29.06.2010

person    schedule
comment
если вы добавите rd.rate в первую часть выбора, это вернет желаемые результаты - person Justin Giboney; 29.06.2010