2010-10-12 3 views
6

Есть ли способ в Oracle, который может вытащить FY? Я использовал сценарий ниже, чтобы вытащить только два FY. Диапазон диапазонов входящих звонков: от FY1998 до FY2009.Группировка по финансовому году (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 

вытягивать два FY в порядке, но это слишком много repeatative при вытягивании более 10 FY.

ответ

8

Добавить 83 дней к вашей дате и укоротить его целый год:

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

+1 как раз то, что я собирался предложить. –

+0

+1 хотя я бы использовал один «Y» вместо 4 и «интервал» 83 «день» вместо 83. Но TRUNC здесь намного лучше, чем TO_CHAR. –

+0

Почему вы добавляете 83 дней? – Sun

1

Несколько вариантов:

Вы можете использовать функцию to_char здесь. Проверить эту ссылку для объяснения: http://www.techonthenet.com/oracle/functions/to_char.php

Вы также можете попробовать использовать тематическое заявление

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 

В конце концов, если у вас есть создать привилегии таблицы вы можете рассмотреть вопрос о принятии таблицы даты поиска. Найдите «измерение даты» в направляющих хранилища данных.

Например:
Ваша таблица будет иметь дату, date_desc, fiscal_year и т.д ....

тогда вы могли бы просто присоединиться и группы по финансовому году, или то, что вы хотите.

2

Предполагая, что Oracle 9i +, используйте выражение случай:

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

Когда t.date находится на 01 ноября? ЭКСТРАКТ (МЕСЯЦ ИЗ t.date)> = 10, но не ЭКСТРАКТ (ДЕНЬ ОТ t.date)> = 10 – eumiro

+0

@eumiro: Хороший улов, исправлено. –

2

И для полноты картины, в дополнение к @eumiro ответ. В странах (таких как Австралия), которые имеют финансовый год с 1 июля по 30 июня, вы можете заменить 83 на .

0

Вот еще один способ легко определить финансовый год на дату для тех, кто финансовый год длится с июля по июнь:

SELECT 'FY'||TO_CHAR(ROUND(your_date_here,'YEAR'),'YY') AS FY 
Смежные вопросы