Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在oracle sql developer中按年度和月份分组获取当前财政年度的数据?_Sql_Oracle - Fatal编程技术网

如何在oracle sql developer中按年度和月份分组获取当前财政年度的数据?

如何在oracle sql developer中按年度和月份分组获取当前财政年度的数据?,sql,oracle,Sql,Oracle,我正在努力获取本财年和上一财年每月的总金额。我不能硬编码日期。它应基于当前日期。日期列的格式如下10年1月13日 金额为整数格式 我希望它采用以下格式: Month 2016-17 2017-18 June 17890 50980 July 45900 14879 August September October November December January February March April May 我无法通过我编写

我正在努力获取本财年和上一财年每月的总金额。我不能硬编码日期。它应基于当前日期。日期列的格式如下10年1月13日 金额为整数格式

我希望它采用以下格式:

Month       2016-17   2017-18

June         17890    50980
July         45900    14879
August
September
October
November
December
January
February
March 
April
May
我无法通过我编写的当前查询

SELECT
   CASE WHEN MONTH(sysdate)>=7 THEN
          concat(YEAR(sysdate), '-',YEAR(sysdate)+1)
   ELSE concat(YEAR(sysdate)-1,'-', YEAR(sysdate)) END AS financial_year,
   SUM(AMOUNT)
FROM TABLE a
GROUP BY financial_year ;

我没有认真检查我的日期算法,但希望这个例子能给你一个解决方法的想法

设置一些测试数据:

SQL> exec dbms_random.seed(0)

PL/SQL procedure successfully completed.

--
-- 1000 random dates and values
--
SQL> create table t as
  2  select date '2016-01-01' + trunc(dbms_random.value(1,800)) dte,
  3        rownum amount
  4  from dual
  5  connect by level <= 1000;

Table created.

--
-- sample data at the extrema
--

SQL>
SQL> select * from t
  2  order by 1
  3  fetch first 10 rows only;

DTE           AMOUNT
--------- ----------
02-JAN-16        562
03-JAN-16        486
04-JAN-16        843
05-JAN-16        661
06-JAN-16        255
06-JAN-16        382
07-JAN-16         31
07-JAN-16        506
07-JAN-16        290
07-JAN-16        185

10 rows selected.

SQL>
SQL> select * from t
  2  order by 1 desc
  3  fetch first 10 rows only;

DTE           AMOUNT
--------- ----------
10-MAR-18        978
09-MAR-18        262
08-MAR-18        295
07-MAR-18         33
06-MAR-18        469
03-MAR-18        454
03-MAR-18        593
03-MAR-18        538
02-MAR-18        226
02-MAR-18        928

10 rows selected.

SQL>

您没有提供任何关于“a”表中有哪些列的线索。因此,在我的回答中,我假设您有一些YOURTABLE表,其中有一些事务(订单)行。在这些行中,YOURTABLE.YOURDATE日期作为订单日期,YOURTABLE.YOURAMOUNT作为订单金额

您只需按月份对订单金额进行分组即可:

group by trunc(t.YOURDATE, 'mm')
但是,如果您想像您的示例中那样将这些组表示为两列,那么您应该从表中进行两次选择(过去一年和当前一年)。然后加入他们。以下是一个例子:

with curryear as
 (select to_char(trunc(t.YOURDATE, 'mm'), 'month') dmonth,
         sum(t.YOURAMOUNT) dresults
    from YOURTABLE t
   group by trunc(t.YOURDATE, 'mm')
  having trunc(t.YOURDATE, 'mm') >= '01-JUL-2017'
   order by trunc(t.YOURDATE, 'mm') asc),
pastyear as
 (select to_char(trunc(t.YOURDATE, 'mm'), 'month') dmonth,
         sum(t.YOURAMOUNT) dresults
    from YOURTABLE t
   group by trunc(t.YOURDATE, 'mm')
  having trunc(t.YOURDATE, 'mm') between '01-JUL-2016' and '01-JUN-2017'
   order by trunc(t.YOURDATE, 'mm') asc)
select curryear.dmonth   "Month",
       pastyear.dresults    "2016-17",
       curryear.dresults "2017-18"
  from curryear, pastyear
 where curryear.dmonth = pastyear.dmonth;

希望这有帮助

不要使用标签,因为产品不涉及DalRight jen谢谢,下次会记住。可能重复@goonernike您所说的日期列的格式如下10年1月13日好吧,那是错误的,因为
date
没有任何格式。您看到的格式只是在特定于语言环境的NLS设置中显示它。现在,回到您所需的输出,您需要提供工作测试用例,即创建表、插入语句、实现输出和所需输出的规则。为什么到处使用
sysdate
?它是一个返回当前日期和时间的函数。也许你需要一个列的名字和日期在这里?
with curryear as
 (select to_char(trunc(t.YOURDATE, 'mm'), 'month') dmonth,
         sum(t.YOURAMOUNT) dresults
    from YOURTABLE t
   group by trunc(t.YOURDATE, 'mm')
  having trunc(t.YOURDATE, 'mm') >= '01-JUL-2017'
   order by trunc(t.YOURDATE, 'mm') asc),
pastyear as
 (select to_char(trunc(t.YOURDATE, 'mm'), 'month') dmonth,
         sum(t.YOURAMOUNT) dresults
    from YOURTABLE t
   group by trunc(t.YOURDATE, 'mm')
  having trunc(t.YOURDATE, 'mm') between '01-JUL-2016' and '01-JUN-2017'
   order by trunc(t.YOURDATE, 'mm') asc)
select curryear.dmonth   "Month",
       pastyear.dresults    "2016-17",
       curryear.dresults "2017-18"
  from curryear, pastyear
 where curryear.dmonth = pastyear.dmonth;