2010-10-12 22 views
6

C'è un modo in Oracle che può tirare il FY? Ho usato la sceneggiatura qui sotto per tirare solo due FY. L'intervallo di date Mytable è compreso tra FY1998 e FY2009.Raggruppamento per Anno Fiscale (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 

tirando due FY è OK ma è troppo ripetitivo quando si tira più di 10 FY.

risposta

8

Aggiungi 83 giorni di tempo per la data e troncare per tutto l'anno:

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

+1 proprio quello che stavo per suggerire. –

+0

+1 anche se userei un singolo 'Y' invece di 4 e "intervallo '83' giorno" invece di solo 83. Ma TRUNC è molto meglio di TO_CHAR qui. –

+0

Perché aggiungi 83 giorni? – Sun

1

Alcune opzioni:

È possibile utilizzare la funzione to_char qui. Controllare questo link per una spiegazione: http://www.techonthenet.com/oracle/functions/to_char.php

Si può anche provare a utilizzare una dichiarazione caso

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 

In definitiva, se si dispone di creare privilegi di tabella che si può prendere in considerazione facendo una tabella di data ricerca. Cerca "dimensione data" nelle guide di data warehouse.

Ad esempio:
La tabella avrebbe data, date_desc, fiscal_year, ecc ....

allora si può solo aderire e di gruppo per l'anno fiscale, o qualsiasi altra cosa che si desidera.

2

Supponendo Oracle 9i +, utilizzare un'espressione 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

Quando t.date è 01-novembre? ESTRATTO (MESE DAL DATE)> = 10 ma non ESTRATTO (GIORNO DAL DATE)> = 10 – eumiro

+0

@eumiro: buona cattura, corretta. –

2

E per completezza, oltre a @eumiro risposta. Nei paesi (come l'Australia) che hanno un anno finanziario che va dal 1 ° luglio al 30 giugno, è possibile sostituire l'83 con .

0

Ecco un altro modo per determinare facilmente l'esercizio fiscale di una data per coloro che è l'anno fiscale va da luglio a giugno:

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