【问题标题】:Select from two tables to find vat rate based on effective date从两个表中选择以根据生效日期查找增值税率
【发布时间】:2011-03-09 18:53:08
【问题描述】:

我有这两张桌子:

mysql> desc 增值税率; +-------------+----------------+------+-----+------ ---+-------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-------------+----------------+------+-----+------ ---+-------+ | rate_id | varchar(5) |否 |优先级 |空 | | |姓名 | varchar(255) |否 | |空 | | |类型 |枚举('O','I') |否 | |空 | | |默认 |小整数(1) |是 | | 0 | | +-------------+----------------+------+-----+------ ---+-------+ 6 行一组(0.00 秒) mysql> desc vat_rates_details; +-------------+-------------+------+-----+-------- -+--------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-------------+-------------+------+-----+-------- -+--------+ | rate_id | varchar(10) |否 | |空 | | |生效日期 |日期 |否 | |空 | | |率 |浮动 |否 | |空 | | +-------------+-------------+------+-----+-------- -+--------+ 3 行一组(0.00 秒)

我需要一个查询,它可以提供 vat_rates.name、vat_rates.rate_id、vat_rates_details.rate,其中 effect_date 为 MAX() 但

为了简化,我需要根据 effect_date 选择所有带有 rate 字段的 vat_rates,而不是将来的日期。

数据示例:

增值税率:
rate_id = 'L9'
名称 = 'MyVatName'
类型 = 'O'
默认 = 1

vat_rates_details(第 1 行):
rate_id = 'L9'
效果日期 = '2000-01-01'
率 = 20

vat_rates_details(第 2 行):
rate_id = 'L9'
效果日期 = '2010-06-01'
率 = 19

vat_rates_details(第 3 行):
rate_id = 'L9'
效果日期 = '2010-07-01'
率 = 21

预期结果:

+-------------+-------------+------+ | rate_id |姓名 |率 | +-------------+-------------+------+ | L9 | MyVatName | 19 | +-------------+-------------+------+

感谢您的宝贵时间 :)

编辑:预期比率是 19 而不是 20。Tks Justin。

【问题讨论】:

  • 您不期望的是 19 而不是 20?

标签: sql mysql join aggregate-functions


【解决方案1】:
select rd.rate_id, r.name, rd.rate
from (
    select rate_id, max(effect_date) as MaxEffectDate
    from vat_rates_details
    where effect_date < now()
    group by rate_id
) rdm
inner join  vat_rates_details rd on rdm.rate_id = rd.rate_id and rdm.MaxEffectDate = rd.effect_date
inner join vat_rates r on rd.rate_id = r.rate_id

【讨论】:

  • 如果您将 rd.rate 添加到选择的第一部分,这将返回您想要的结果
【解决方案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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多