我正在尝试编写一个将填充临时表的函数。此临时表将由我在名为' Orders'的表中的行填充。 (临时表和Orders共享相同的列名)。 Orders中的行包括Item,Location,Qty,SendDate和EndDate(SendDate和EndDate采用' yyyymmdd'格式)。需要采用SendDate和Enddate之间的差异,并通过日期的差异来扩展数量。示例:一个数量为200且SendDate为3/16且EndDate为3/20的行,该函数需要使用3 / 16-3 / 20的行填充临时表,数量为40。
Sample Data:
- Item Location Qty SendDate EndDate
-Toy Store 200 20150316 20150320
Desired result:
- Item Location Qty SendDate EndDate
-Toy Store 40 20150316 20150320
-Toy Store 40 20150317 20150320
-Toy Store 40 20150318 20150320
-Toy Store 40 20150319 20150320
-Toy Store 40 20150320 20150320
我是游标语句的新手所以我不确定如何尝试这个。提前谢谢。
答案 0 :(得分:1)
在公用表表达式中使用UNION ALL
可以为您提供所需的内容。
我不熟悉Oracle的日期操作,但是这样的事情可以起作用:
WITH x ( d ) AS (
SELECT TO_DATE('2014-12-25', 'yyyy-mm-dd')
FROM dual
UNION ALL
SELECT d + interval '1' day
FROM x
WHERE d < TO_DATE('2014-12-31', 'yyyy-mm-dd')
)
SELECT *
FROM x
答案 1 :(得分:1)
您可以使用CONNECT BY
子句:
WITH YOUR_TABLE (Item,Location,Qty,SendDate,EndDate)
AS (SELECT 'Toy','Store',200,20150316,20150320 FROM DUAL) -- sample data
SELECT item,
location,
qty,
TO_NUMBER (
TO_CHAR (TO_DATE (senddate, 'yyyymmdd') + LEVEL - 1, 'yyyymmdd'))
senddate,
enddate
FROM YOUR_TABLE
CONNECT BY LEVEL<=(TO_DATE(enddate,'yyyymmdd') - TO_DATE(senddate,'yyyymmdd')) + 1;