Berikut adalah contoh yang lebih baik menggunakan tanggal. Asumsikan kita ingin membuat tabel tanggal. 1 baris untuk setiap bulan selama tahun 2017. Kami membuat @startDate
sebagai jangkar dan @endDate
sebagai terminatornya. Kami menetapkan ini menjadi 12 bulan terpisah, karena kami ingin satu tahun. Kemudian, rekursi akan menambahkan satu bulan melalui DATEADD
fungsi ke @startDate
sampai terminator bertemu di WHERE
ayat. Kita tahu bahwa dibutuhkan 11 rekursi untuk mencapai 12 bulan... yaitu, 11 bulan + tanggal mulai. Jika kita mengatur MAXRECURSION
untuk apa pun yang kurang dari 11, maka itu akan gagal karena 11 diperlukan untuk memenuhi WHERE
klausa dalam CTE
rekursif kami , itulah terminatornya..
declare @startDate datetime = '20170101'
declare @endDate datetime = '20171201'
;WITH Months
as
(
SELECT @startDate as TheDate --anchor
UNION ALL
SELECT DATEADD(month, 1, TheDate) --recursive
FROM Months
WHERE TheDate < @endDate --terminator... i.e. continue until this condition is met
)
SELECT * FROM Months OPTION (MAXRECURSION 10) --change this to 11
Untuk kueri Anda, bergabung saja sudah cukup.
select
firstName
,lastName
,orderDate
,productID
from
customers c
inner join
orders o on o.customerID = c.id
Namun, saya melihat bahwa Anda mencoba mengembalikan ini dalam format yang aneh, yang harus ditangani dalam aplikasi pelaporan apa pun yang Anda gunakan. Ini akan membuat Anda dekat tanpa rekursi.
with cte as(
select
firstName
,lastName
,orderDate
,productID
,dense_rank() over(order by c.id) as RN
from
customers c
inner join
orders o on o.customerID = c.id)
select distinct
firstName
,lastName
,null
,null
,RN
from
cte
union all
select
''
,''
,orderDate
,productID
,RN
from
cte
order by RN, firstName desc