我有一张桌子:
DocNum, DocDate, DocDueDate, ItemCode and Quantity
现在,我需要在此表中找到Docdate
和DocDuedate
之间的月份列表,其中包含所有其他列的详细信息。
例如:
DocNum DocDate DocDuedate Itemcode Quantity
10001 20180101 20180509 A0001 100
我需要这样的结果:
DocNum Monthdetails Itemcode Quantity
10001 20180101 A0001 100
10001 20180201 A0001 100
10001 20180301 A0001 100
10001 20180401 A0001 100
10001 20180501 A0001 100
我怎样才能做到这一点?
答案 0 :(得分:0)
您需要使用CTE Recursive编写日历
;WITH CTE(DocNum,DocDate,DocDuedate,Itemcode,Quantity) AS(
SELECT DocNum,DocDate,DocDuedate,Itemcode,Quantity
FROM T
UNION ALL
SELECT DocNum,DATEADD(MONTH,1,DocDate) DocDate, DocDuedate,Itemcode,Quantity
FROM CTE
WHERE DATEADD(MONTH,1,DocDate) <= DocDuedate
)
SELECT t.DocNum,
convert(varchar, t.DocDate, 112) as DocDate,
t.Itemcode,
t.Quantity
FROM CTE t
sqlfiddle:http://sqlfiddle.com/#!18/790b9/7
答案 1 :(得分:0)
另一种方法可能就是在不使用CTE的情况下进行查询。
select DocNum, Dateadd(month, m.number, docdate) as Monthdetails, Itemcode, Quantity
from [TableName] t
inner join (
select distinct number
FROM master..[spt_values]
where number>=0 and number<1200
) m
on Dateadd(month, m.number, docdate) between
t.docdate and t.docduedate
<强> DEMO 强>
注意:以上查询仅适用于100年的日期差异,如果您需要更多,则需要增加数字的值&lt; = 1200