我希望创建一个包含以下列的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查询将如何为该日期选择正确的增值税率?
答案 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)
更简单的选择可能只是对您的数据结构进行非规范化,并将增值税税率存储在发票表中。