首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle11g创建一个循环(oracle11g)

oracle11g创建一个循环(oracle11g)
EN

Stack Overflow用户
提问于 2014-10-27 13:50:22
回答 2查看 166关注 0票数 0

请您解释一下我如何创建一个循环函数来给出如下相同的结果,

代码语言:javascript
复制
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

我想把结果填充到列中,就像.

我想用这个回溯到2000年1月,但是,我真的不想重复这些行。而且,每个月我都要添加另一行来覆盖新的一个月。我想知道SQL中是否有类似于DO的循环函数.循环直到在Excel中。

谢谢

SMORF

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-27 14:19:14

你想要的是:

代码语言:javascript
复制
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"))

输出:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2014-10-27 14:13:11

这太长了,不能发表评论。

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

代码语言:javascript
复制
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。我建议你谷歌“甲骨文动态枢纽”,以获得一些关于如何解决这个问题的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26589075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档