如何在oracle sql developer中按年度和月份分组获取当前财政年度的数据?
我正在努力获取本财年和上一财年每月的总金额。我不能硬编码日期。它应基于当前日期。日期列的格式如下10年1月13日 金额为整数格式 我希望它采用以下格式:如何在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 我无法通过我编写
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;