2014-10-27 19 views
0

请你能解释我如何可以创建一个循环功能给我相同的结果如下,的Oracle SQL - 创建一个循环(Oracle11g的)

select to_char(add_months(trunc(sysdate,'MM'),- 0),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 0),'YYYY') today, 
     to_char(add_months(trunc(sysdate,'MM'),- 1),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 1),'YYYY') date_1, 
     to_char(add_months(trunc(sysdate,'MM'),- 2),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 2),'YYYY') date_2, 
     to_char(add_months(trunc(sysdate,'MM'),- 3),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 3),'YYYY') date_3, 
     to_char(add_months(trunc(sysdate,'MM'),- 4),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 4),'YYYY') date_4, 
     to_char(add_months(trunc(sysdate,'MM'),- 5),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 5),'YYYY') date_5, 
     to_char(add_months(trunc(sysdate,'MM'),- 6),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 6),'YYYY') date_6, 
     to_char(add_months(trunc(sysdate,'MM'),- 7),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 7),'YYYY') date_7, 
     to_char(add_months(trunc(sysdate,'MM'),- 8),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 8),'YYYY') date_6, 
     to_char(add_months(trunc(sysdate,'MM'),- 9),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- 9),'YYYY') date_9, 
     to_char(add_months(trunc(sysdate,'MM'),-10),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),-10),'YYYY') date_10, 
     to_char(add_months(trunc(sysdate,'MM'),-11),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),-11),'YYYY') date_11 
from dual 

我想要的结果,在填充到列,像...

enter image description here

我想用这个回去2000年1月,但真的不希望再重复这些行。此外,每个月我都会增加一条线路来覆盖新月份。我想知道SQL中是否有LOOP函数类似于DO ... LOOP UNTIL在Excel中。

感谢

SMORF

+0

有什么不对你的代码? “循环功能”是什么意思? – 2014-10-27 13:52:16

+0

嗨,我想用这个回到2000年1月,但是,并不真的想重复这些路线。此外,每个月我都会增加一条线路来覆盖新月份。我想知道在SQL中是否有LOOP函数类似于DO ... LOOP UNTIL在Excel – SMORF 2014-10-27 13:56:34

+1

SQL和PL/SQL是不同的引擎。如果你可以在'SQL'中实现某些东西,那么没有理由在'PL/SQL'中执行。 – 2014-10-27 13:59:57

回答

2

我想你想要的是:

select * from (
select level-1 as num, 
to_char(add_months(trunc(sysdate,'MM'),- (level-1)),'MM')||'-'||to_char(add_months(trunc(sysdate,'MM'),- (level-1)),'YYYY') as dte 
from dual 
connect by level <= 12 
) 
pivot (
max(dte) as "DATE" 
for num in (0 as "CURRENT", 1 as "1", 2 as "2", 3 as "3", 4 as "4", 5 as "5",6 as "6",7 as "7",8 as "8",9 as "9",10 as "10", 11 as "11")) 

输出:

CURRENT_DATE 1_DATE 2_DATE 3_DATE 4_DATE 5_DATE 6_DATE 7_DATE 8_DATE 9_DATE 10_DATE 11_DATE 
10-2014 09-2014 08-2014 07-2014 06-2014 05-2014 04-2014 03-2014 02-2014 01-2014 12-2013 11-2013 
+0

感谢tbone,这是完美的 – SMORF 2014-10-27 14:45:02

0

这是太长了评论。

SQL查询具有固定数量的列。如果您每个月都有一个单独的行,您可以做你想做的事。我会写这样的东西是这样的:

with n as (
     select level - 1 as n 
     from dual 
     connect by level <= months_between(sysdate, date '2000-01-01') 
select to_char(add_months(sysdate, n.n), 'YYYY-MM') 
from n; 

(注:我改变了格式从MM-YYYY,以YYYY-MM,因为我更喜欢后者,但可以保留MM-YYYY,如果你喜欢)

使这些列成为SQL的问题。 SQL查询具有固定数量的列。要有一个可变数字,您将需要使用动态SQL。我会建议你谷歌“Oracle动态数据透视”来获得一些关于如何解决这个问题的想法。