2010-10-12 18 views
6

Czy w Oracle istnieje sposób na wyciągnięcie FY? Użyłem poniższego skryptu, aby wyciągnąć tylko dwa FY. Zakres dat w Mytable to przedział od 1991 do 2009 roku.Grupowanie według roku obrachunkowego (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 

Ciągnięcie dwóch FY jest OK, ale to zbyt wiele powtarzała się przy ciągnięciu ponad 10 FY.

Odpowiedz

8

Dodaj 83 dni do daty i obciąć je do całego roku:

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

+1 tylko to, co dzieje się sugerować. –

+0

+1, chociaż użyłbym pojedynczego "Y" zamiast 4 i "interwału" 83 "dnia" zamiast tylko 83. Ale TRUNC jest tutaj znacznie lepszy niż TO_CHAR. –

+0

Dlaczego dodajesz 83 dni? – Sun

1

kilka możliwości:

można użyć funkcji to_char tutaj. Sprawdź ten link do wyjaśnienia: http://www.techonthenet.com/oracle/functions/to_char.php

Można również spróbować użyć instrukcji case

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 

Ostatecznie, jeśli masz uprawnienia tworzenia tabel może warto rozważyć tabelę data odnośnika. Wyszukaj "wymiar daty" w przewodnikach hurtowni danych.

Na przykład:
Twój stół miałby datę date_desc, fiscal_year, itp ....

następnie można po prostu dołączyć i grupę za rok obrotowy, lub cokolwiek innego chcesz.

2

Zakładając Oracle 9i +, użycie wyrażenia CASE:

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

Kiedy t.date jest w dniu 01 listopada? EKSTRAKT (MIESIĄC OD DNIA)> = 10, ale NIE EKSTRAKT (DZIEŃ OD DNIA)> = 10 – eumiro

+0

@eumiro: Dobry połów, poprawiony. –

2

I pod względem kompletności, oprócz @eumiro odpowiedź. W krajach (takich jak Australia), które mają rok finansowy od 1 lipca do 30 czerwca, można zamienić 83 na .

0

Oto kolejny sposób, aby łatwo określić rok obrotowy w terminie dla tych, którzy'S Rok obrotowy trwa od lipca do czerwca:

SELECT 'FY'||TO_CHAR(ROUND(your_date_here,'YEAR'),'YY') AS FY 
Powiązane problemy