3

SQL Server の再帰クエリに問題があります。

2 つのテーブルがあるとします。

  1. Holiday: このテーブルには、すべての休日 (holidayDate営業日ではない) が格納されます。
  2. Invoice: このテーブルには、次の支払日が格納されます ( nextPaymentDate)

が休日のテーブルにある場合nextPaymentDateは、 holidayDate更新する必要があります。

nextPaymentDate = nextPaymentDate + 1 day

nextPaymentDateこのステップは、がなくなるまで処理する必要がありholidayDateます。

以下のサンプル データの例を参照してください。

Holidayテーブル:

HolidyaID      HolidayDate
-----------------------------
   1           2012-01-02
   2           2012-01-03
   3           2012-01-04
   4           2012-01-08
   5           2012-01-12
   6           2012-01-13
   7           2012-01-20
   8           2012-01-21
   9           2012-01-22
   10          2012-01-23
   11          2012-01-29
   12          2012-01-30

Invoiceテーブル

InvoiceID      NextPaymentDate
------------------------------
   1           2012-01-01
   2           2012-01-02
   3           2012-01-09
   4           2012-01-20

Invoiceこのクエリを実行した後、このようにテーブル内のデータを確認したい

InvoiceID      NextPaymentDate
-------------------------------
   1               2012-01-01
   2               2012-01-05
   3               2012-01-09
   4               2012-01-24

この結果を出力する SQL クエリを作成するにはどうすればよいですか?

このクエリは、http://sqlfiddle.com/# !6/de346/3 でテストできます。

ありがとう!

4

3 に答える 3

0
    select invoiceid, coalesce(nd,NextPaymnetDate) dd from invoice i left join
    (
    select *,(select min(dateADD(dd,1,holidaydate)) from holiday 
where holidaydate>=h.holidaydate and 
dateADD(dd,1,holidaydate) not in (select holidaydate from holiday)) nd 
    from holiday h) h on NextPaymnetDate = holidaydate;
于 2013-01-28T13:53:47.457 に答える
0
select InvoiceID,
Case when [holidaydate] is null then [NextPaymnetDate]
else
DateAdd(dd,1,
(Select min([holidaydate]) from holiday h
where  h.[holidaydate]>[NextPaymnetDate]
and not exists(Select * from holiday h2 where h2.[holidaydate]=DateAdd(dd,1,h.[holidaydate])) 
))
end
from invoice
left Join holiday on [holidaydate]=[NextPaymnetDate]
于 2013-01-26T19:06:05.223 に答える
0
with holidayBatch as
(
  select workingdate = dateadd(dd, 1, holidayDate)
  from Holiday h
  where not exists (select 1 from Holiday nxt
                    where nxt.holidaydate = dateadd(dd, 1, h.holidaydate))
)
select i.invoiceid,
  case when h.holidaydate is null then i.NextPaymentDate else hb.workingdate end
from Invoice i
  left join Holiday h on i.NextPaymentDate = h.holidaydate
  outer apply (select top 1 workingdate
              from holidayBatch hb where workingdate > NextPaymentDate
              order by workingdate) hb
order by i.invoiceid

SQL フィドル

于 2013-01-26T19:09:09.320 に答える