2010-10-12 21 views
6

Gibt es einen Weg in Oracle, der die FY ziehen kann? Ich benutzte das folgende Skript, um nur zwei FY zu ziehen. Mein Zeitraum ist von FJ1998 bis FY2009.Gruppierung nach Geschäftsjahr (Oracle)

SELECT 'FY2008' as FY, 
     Site, 
     COUNT(*) 
    FROM mytable 
    WHERE date >='10-OCT-2007' 
    AND date <'10-OCT-2008' 
GROUP BY site 

SELECT 'FY2008' as FY, 
     Site, 
     COUNT(*) 
    FROM mytable 
    WHERE date >='10-OCT-2008' 
    AND date <'10-OCT-2009' 
GROUP BY site 

Ziehen zwei FY OK ist, aber es ist zu viel repeatative, wenn mehr als 10 FY ziehen.

Antwort

8

hinzufügen 83 Tage zu Ihrem Datum und kürzen sie ganze Jahr:

select 'FY'||TRUNC(date + 83, 'YYYY') as FY, Site, count(*) 
from mytable 
group by 'FY'||TRUNC(date + 83, 'YYYY'), site 
+0

+1 genau das, was ich vorschlagen würde. –

+0

+1 obwohl ich ein einzelnes 'Y' anstelle von 4 und "Intervall '83' Tag" statt nur 83 verwenden würde. Aber TRUNC ist viel besser als TO_CHAR hier. –

+0

Warum fügst du 83 Tage hinzu? – Sun

1

ein paar Optionen:

Sie können hier die to_char-Funktion verwenden. Überprüfen Sie diesen Link für eine Erklärung: http://www.techonthenet.com/oracle/functions/to_char.php

Sie auch versuchen können

einen Fall Anweisung
select case when date >='10-OCT-2007' and date <'10-OCT-2008' then 'FY08' 
      when date >='10-OCT-2008' and date <'10-OCT-2009' then 'FY09' 
      else 'Other' end as fiscal_year, count(*) 
    from mytable 
group by case when date >='10-OCT-2007' and date <'10-OCT-2008' then 'FY08' 
      when date >='10-OCT-2008' and date <'10-OCT-2009' then 'FY09' 
      else 'Other' end 

Letztendlich, wenn Sie Tabellenberechtigungen erstellen müssen Sie ein Datum Lookup-Tabelle betrachten möchten machen. Suchen Sie in Data Warehousing Guides nach "date dimension".

Zum Beispiel:
Ihr Tisch Datum haben würde, date_desc, FISCAL_YEAR, etc ....

dann könnte man nur durch das Geschäftsjahr verbinden und Gruppe oder was auch immer Sie wollen.

2

Unter der Annahme, Oracle 9i +, verwenden Sie einen CASE-Ausdruck:

SELECT CASE 
      WHEN TO_CHAR(t.date,) = 10 AND EXTRACT(DAY FROM t.date) >= 10 THEN 
      'FY' || EXTRACT(YEAR FROM t.date) + 1 
      WHEN TO_CHAR(t.date,) > 10 THEN 
      'FY' || EXTRACT(YEAR FROM t.date) + 1 
      ELSE 
      'FY' || EXTRACT(YEAR FROM t.date) 
     END AS FY, 
     t.site, 
     COUNT(*) 
    FROM YOUR_TABLE t 
GROUP BY t.site, FY 
+0

Wenn t.date am 01. November ist? EXTRACT (Monat von t.date)> = 10, aber nicht EXTRACT (DAY FROM t.date)> = 10 – eumiro

+0

@eumiro: Guter Fang, korrigiert. –

2

Und der Vollständigkeit halber, zusätzlich Antwort auf @eumiro. In Ländern wie Australien, die ein Geschäftsjahr vom 1. Juli bis 30. Juni haben, können Sie die 83 durch ersetzen.

0

Hier ist eine weitere Möglichkeit, auf einfache Weise das Geschäftsjahr eines Datums für diejenigen zu bestimmen, die von Juli bis Juni läuft das Geschäftsjahr ist:

SELECT 'FY'||TO_CHAR(ROUND(your_date_here,'YEAR'),'YY') AS FY 
Verwandte Themen