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

Posted

技术标签:

【中文标题】如何在oracle sql developer中按年和月分组获取当前财政年度的数据?【英文标题】:How to get fetch data for the current financial year in oracle sql developer grouping by year and month? 【发布时间】:2018-03-01 06:48:46 【问题描述】:

我正在尝试获取当前财政年度和上一个财政年度的每月总金额。我不能硬编码日期。它应该基于当前日期。日期列采用以下格式 13-JAN-10 并且金额是整数格式。

我想要以下格式:

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 Group By - counting records per month/year, error on insert - NOT A VALID MONTH的可能重复 @goonernike 你说 日期列的格式如下 13-JAN-10 嗯,这是错误的,因为DATE 没有任何格式。您看到的格式只是在您的语言环境特定的 NLS 设置中显示它。现在,回到您所需的输出,您需要提供工作测试用例,即 CREATE TABLE、INSERT STATEMENTS、实现输出的规则和所需的输出。 你为什么到处使用sysdate?它是一个返回当前日期和时间的函数。也许您需要一个带有日期的列的名称? 【参考方案1】:

我没有太认真地检查我的日期算术,但希望这个例子能让你了解如何解决它

设置一些测试数据:

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>

这是查询。 fin_start 定义了财政年度的开始(因为它不是每个人的六月:-))

SQL> with fin_start as
  2   ( select date '2017-06-01' fs from dual )
  3  select mth, last_fin_year, this_fin_year
  4  from (
  5  select
  6    to_char(dte,'Month') mth,
  7    to_char(dte,'MM') mth_seq,
  8    fin_start.fs,
  9    sum(case when dte between add_months(fin_start.fs,-112) and fin_start.fs-1 then amount end) last_fin_year,
 10    sum(case when dte between fin_start.fs and add_months(fin_start.fs,12)-1 then amount end) this_fin_year
 11  from t, fin_start
 12  group by
 13    to_char(dte,'Month'),
 14    to_char(dte,'MM'),
 15    fin_start.fs
 16  )
 17  order by
 18    case when mth_seq >= to_char(fs,'MM') then 1 else 2 end,
 19    mth_seq;

MTH                                  LAST_FIN_YEAR THIS_FIN_YEAR
------------------------------------ ------------- -------------
June                                         20658         22188
July                                         13267          8844
August                                       15907         20457
September                                    15140         21906
October                                      21850         15100
November                                     18153         21052
December                                     14111         14677
January                                      44159         23112
February                                     43819         14267
March                                        50641          5047
April                                        37397
May                                          38748

12 rows selected.

SQL>
SQL>

【讨论】:

【参考方案2】:

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

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

group by trunc(t.YOURDATE, 'mm')

但是,如果您想像示例中那样将这些组表示为 2 列,则应从 YOURTABLEe 中进行 2 次选择(过去一年和当前年份)。然后加入他们。示例如下:

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;

希望这会有所帮助!

【讨论】:

以上是关于如何在oracle sql developer中按年和月分组获取当前财政年度的数据?的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql developer工具 如何给用户分配权限

Oracle Sql Developer如何在Oracle中创建和设置角色?

如何安装pl/sql developer

如何安装pl/sql developer

如何在 SQL Developer 中检查语法 Oracle 存储过程?

oracle 客户端 sql developer 如何修改jdk版本