Sql 如何在一个季度内划分月份和分组月份

Sql 如何在一个季度内划分月份和分组月份,sql,oracle,Sql,Oracle,我想在几个月的列上应用分区,并在一个季度内对它们进行分组 Months Jan-18 Feb-18 Mar-18 Apr-18 May-18 Jun-18 Jul-18 Aug-18 Sep-18 Oct-18 Nov-18 Dec-18 我的日历从六月开始 所以 我试过了 select ADD_MONTHS(trunc(to_date('01-APR-18'), 'Q'),2) from dual; 也试过 select ADD_MONTHS(trunc(to_date('01-JUN-

我想在几个月的列上应用分区,并在一个季度内对它们进行分组

Months

Jan-18
Feb-18
Mar-18
Apr-18
May-18
Jun-18
Jul-18
Aug-18
Sep-18
Oct-18
Nov-18
Dec-18
我的日历从六月开始

所以

我试过了

select ADD_MONTHS(trunc(to_date('01-APR-18'), 'Q'),2) from dual;
也试过

select ADD_MONTHS(trunc(to_date('01-JUN-18'), 'Q'),-1) from dual;
output is '01-Mar-18',whereas expected reuslt is '01-JUN-18' .
预期结果集:

 Months     Expected result 

02-Jan-18      01-Dec-17
02-Feb-18      01-Dec-17
05-Mar-18      01-Mar-18
08-Apr-18      01-Mar-18
05-May-18      01-Mar-18
05-Jun-18      01-Jun-18
05-Jul-18      01-Jun-18
09-Aug-18      01-Jun-18
10-Sep-18      01-Sep-18
11-Oct-18      01-Sep-18
11-Nov-18      01-Sep-18
11-Dec-18      01-Dec-18

有人能帮忙吗?你能用
案例吗

select (case when extract(month from <date>) in (6, 7, 8) then 1
             when extract(month from <date>) in (9, 10, 11) then 2
             when extract(month from <date>) in (12 1, 2) then 3
             when extract(month from <date>) in (3, 4, 5) then 4
        end) as quarter
如果您想要的是开始日期,您可以使用
案例
(这是最明确、最容易理解的)或执行奇特的算术:

select add_months(add_months(trunc(add_months(<date>, -5), 'YYYY'), 6),
                  to_number(to_char(add_months(<date>, -5), 'Q')) * 3 - 4
                 )
选择add_months(add_months)(trunc(add_months(,-5),'YYYY'),6),
到字符(加上月份(,-5),'Q'))*3-4
)
这将添加自6月1日以来您所处的会计年度的季度数


这里有一点说明。

您尝试的解决方案的问题是缺少一个步骤

如果您的季度与“标准”季度相差一个月,那么-给定日期,任何日期-您必须将日期向前移动一个月,然后截短到季度,然后向后移动一个月。您执行了步骤2和3,但缺少步骤1

with
  inputs ( dt ) as (
    select to_date('02-Jan-18', 'dd-Mon-yy') from dual union all
    select to_date('02-Feb-18', 'dd-Mon-yy') from dual union all
    select to_date('05-Mar-18', 'dd-Mon-yy') from dual union all
    select to_date('08-Apr-18', 'dd-Mon-yy') from dual union all
    select to_date('05-May-18', 'dd-Mon-yy') from dual union all
    select to_date('05-Jun-18', 'dd-Mon-yy') from dual union all
    select to_date('05-Jul-18', 'dd-Mon-yy') from dual union all
    select to_date('09-Aug-18', 'dd-Mon-yy') from dual union all
    select to_date('10-Sep-18', 'dd-Mon-yy') from dual union all
    select to_date('11-Oct-18', 'dd-Mon-yy') from dual union all
    select to_date('11-Nov-18', 'dd-Mon-yy') from dual union all
    select to_date('11-Dec-18', 'dd-Mon-yy') from dual
  )
select dt,
       add_months(trunc(add_months(dt, 1), 'q'), -1) as qtr
from   inputs;

DT          QTR     
---------   ---------
02-Jan-18   01-Dec-17
02-Feb-18   01-Dec-17
05-Mar-18   01-Mar-18
08-Apr-18   01-Mar-18
05-May-18   01-Mar-18
05-Jun-18   01-Jun-18
05-Jul-18   01-Jun-18
09-Aug-18   01-Jun-18
10-Sep-18   01-Sep-18
11-Oct-18   01-Sep-18
11-Nov-18   01-Sep-18
11-Dec-18   01-Dec-18

你能提供你想要的结果集吗?不清楚你想对问题中的四分之一做什么。嗨,戈登,编辑了问题。请检查你写的没有意义(你可能没有仔细检查你写的)。包含1月18日的季度的第一天应该是17年12月1日,而不是18年11月1日(为什么是18日,不管是哪个月?),请小心并仔细检查您的帖子;如果你不这样做,你只会损害你的信誉。嗨,戈登。谢谢你的回复。我不想要季度号,即六月、七月、八月是1,九月、十月、十一月是2。我想在几个月内应用分区。所以我希望2018年6月18日、2018年7月18日和2018年8月18日返回6月1日-18@joe . . . 最后一个查询应该做你想做的。@Gordon..我在问题中提供了预期结果集OP需要一个实际日期。2017年12月1日开始日期确定的季度与2018年12月1日开始日期确定的季度不同。@mathguy。最后一个查询提供季度开始日期。
select trunc(add_months(<date>, -5), 'Q')
select add_months(add_months(trunc(add_months(<date>, -5), 'YYYY'), 6),
                  to_number(to_char(add_months(<date>, -5), 'Q')) * 3 - 4
                 )
with
  inputs ( dt ) as (
    select to_date('02-Jan-18', 'dd-Mon-yy') from dual union all
    select to_date('02-Feb-18', 'dd-Mon-yy') from dual union all
    select to_date('05-Mar-18', 'dd-Mon-yy') from dual union all
    select to_date('08-Apr-18', 'dd-Mon-yy') from dual union all
    select to_date('05-May-18', 'dd-Mon-yy') from dual union all
    select to_date('05-Jun-18', 'dd-Mon-yy') from dual union all
    select to_date('05-Jul-18', 'dd-Mon-yy') from dual union all
    select to_date('09-Aug-18', 'dd-Mon-yy') from dual union all
    select to_date('10-Sep-18', 'dd-Mon-yy') from dual union all
    select to_date('11-Oct-18', 'dd-Mon-yy') from dual union all
    select to_date('11-Nov-18', 'dd-Mon-yy') from dual union all
    select to_date('11-Dec-18', 'dd-Mon-yy') from dual
  )
select dt,
       add_months(trunc(add_months(dt, 1), 'q'), -1) as qtr
from   inputs;

DT          QTR     
---------   ---------
02-Jan-18   01-Dec-17
02-Feb-18   01-Dec-17
05-Mar-18   01-Mar-18
08-Apr-18   01-Mar-18
05-May-18   01-Mar-18
05-Jun-18   01-Jun-18
05-Jul-18   01-Jun-18
09-Aug-18   01-Jun-18
10-Sep-18   01-Sep-18
11-Oct-18   01-Sep-18
11-Nov-18   01-Sep-18
11-Dec-18   01-Dec-18