2012-11-20 86 views
2

我希望創建一個3列VAT_Parameter表具有以下的列:SQL查詢來確定增值稅率

VATID, VATRate, EffectiveDate 

但是,我不能讓我的頭左右我將如何確定增值稅稅率所適用的到發票日期。

例如,如果表是用填充:

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

例如說我有日期2010年4月5日的發票,怎麼會一個SQL查詢選擇該日期的正確的增值稅稅率?

回答

1

我以前遇到過這種事情。有兩種選擇我可以想到:

1.展開表格以生成兩個日期:EffectiveFrom和EffectiveTo。 (你必須有一個關於每一個是獨佔的還是包容性的約定 - 但是在使用日期時這總是一個問題)。這就提出了驗證餐桌人口總體而言是有意義的問題。例如你不會收到1行1/2000/1/1/2002有效的Rate1和另一個(重疊)Rate2從2001年1月30日至2003年1月1日有效的行。或者在沒有費率的情況下發現時間上的空白。因爲這聽起來像是一張變化速度非常緩慢的表格,偶爾會有人(他們知道他們在做什麼?),這可能是最好的解決方案。在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
select top 1 * 
from VatRate 
where EffectiveDate<[email protected] 
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表。稅率變化時收取的增值稅稅率規定比發票日期更復雜。例如,供應日期也很重要。

0

一個更簡單的選項可能是對數據結構進行非規範化並將增值稅稅率存儲在發票表本身中。