SQL查询确定增值税率

时间:2012-11-20 11:56:23

标签: sql-server sql-server-2005

我希望创建一个包含以下列的3列VAT_Parameter表:

VATID, VATRate, EffectiveDate

但是,我无法理解如何确定哪个增值税适用于发票日期。

例如,如果表格填充了:

1, 17.5, 1/4/1991
2, 15, 1/1/2009
3, 20, 4/1/2011

比如说我有一张日期为4/5/2010的发票,SQL查询将如何为该日期选择正确的增值税率?

3 个答案:

答案 0 :(得分:2)

select top 1 *
from VatRate
where EffectiveDate<=@InvoiceDate
order by EffectiveDate desc

或者,使用发票表

select id, invoicedate, rate
from
(
    select 
        inv.id, inv.invoicedate, vatrate.rate, ROW_NUMBER() over (partition by inv.id order by vatrate.effectivedate desc) rn
    from inv
        inner join vatrate
            on inv.invoicedate>=vatrate.effectivedate
) v     
where rn = 1

PS。当费率变化时收取的增值税税率规则比发票日期更复杂。例如,供应日期也很重要。

答案 1 :(得分:1)

我以前遇到过这种事情。我能想到两个选择:

1。展开表格有两个日期:EffectiveFrom和EffectiveTo。 (你必须有一个关于这些是否是独占或包容的约定 - 但在使用日期时这总是一个问题)。这就提出了一个问题,即验证整个表格的数量是否合理。例如你不会得到一行,其中Rate1从1/1 / 2000-1 / 1/2002生效,另一行(重叠),Rate2生效于30/10 / 2001-1 / 1/2003。或者是未发现的时间间隔,不适用率。因为这听起来像一个非常缓慢变化的表,偶尔会填充(由知道他们正在做什么的人?),这可能是最好的解决方案。获得有效费率的SQL将很简单:

SELECT VATRate FROM VATTable WHERE (EffectiveFrom<=[YourInvoiceDate]) AND (EffectiveTo>=[YourInvoiceDate])

2。使用现有的表格结构,并使用一些稍微复杂的SQL来确定发票的有效费率。

使用现有结构,这样的方法可行:

SELECT VATTAble.VATRate FROM
    VATTable
INNER JOIN
    (SELECT Max(EffectiveDate) AS LatestDate FROM VATTable WHERE EffectiveDate<= 
    YourInvoiceDate) latest
ON VATTable.EffectiveDate=latest.LatestDate

答案 2 :(得分:0)

更简单的选择可能只是对您的数据结构进行非规范化,并将增值税税率存储在发票表中。