Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 确定增值税税率的SQL查询_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 确定增值税税率的SQL查询

Sql server 确定增值税税率的SQL查询,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我希望创建一个包含以下列的3列VAT_参数表: VATID, VATRate, EffectiveDate 然而,我不知道如何识别发票日期适用的增值税税率 例如,如果表格中填充了: 1, 17.5, 1/4/1991 2, 15, 1/1/2009 3, 20, 4/1/2011 例如,我有一张日期为2010年4月5日的发票,SQL查询如何为该日期选择正确的增值税税率?我以前遇到过这种情况。我可以想到两个选择: 一,。展开该表以具有两个日期:生效开始日期和生效结束日期。你必须有一个惯例来决定

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

VATID, VATRate, EffectiveDate
然而,我不知道如何识别发票日期适用的增值税税率

例如,如果表格中填充了:

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

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

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

一,。展开该表以具有两个日期:生效开始日期和生效结束日期。你必须有一个惯例来决定每一个日期是排他性的还是包容性的,但这在使用日期时总是一个问题。这就产生了验证表填充作为一个整体是否合理的问题。e、 g.您不会在2000年1月1日至2002年1月1日期间以费率1结束一行,而在2001年10月30日至2003年1月1日期间以费率2结束另一行。或者在没有费率的情况下,未发现的时间差距。由于这听起来像是一张变化非常缓慢的表格,偶尔会有知道自己在做什么的人填写,因此这可能是最好的解决方案。因此,获取有效率的SQL很简单:

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

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

使用您现有的结构,类似这样的功能将起作用:

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

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

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

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