2

次の列を持つ 3 列の VAT_Parameter テーブルを作成しようとしています。

VATID, VATRate, EffectiveDate

しかし、どの付加価値税率が請求書の日付に適用されるかを特定する方法がわかりません。

たとえば、テーブルに次のデータが取り込まれた場合:

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

たとえば、2010 年 4 月 5 日の請求書があるとします。SQL クエリでその日付の正しい VAT 率を選択するにはどうすればよいでしょうか?

4

3 に答える 3

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。VAT 率が変更された場合に請求される VAT 率の規則は、請求書の日付だけではなく、より複雑です。たとえば、供給日も重要です。

于 2012-11-20T12:09:48.797 に答える
1

私は以前にこのようなことに出くわしたことがあります。私が考えることができる2つの選択肢があります:

1.テーブルを展開して、EffectiveFrom と EffectiveTo の 2 つの日付を表示します。(これらのそれぞれが排他的であるか包括的であるかについての規則が必要になりますが、日付を使用する場合は常に問題になります)。これにより、テーブルの母集団が全体として妥当であることを検証するという問題が生じます。たとえば、Rate1 が 2000 年 1 月 1 日から 2002 年 1 月 1 日まで有効な行と、Rate2 が 2001 年 10 月 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
于 2012-11-20T12:09:16.973 に答える