#sql #oracle
#sql #Oracle
Вопрос:
Предположим, у меня есть данные, как показано ниже
ACT_NO DATE1 AMOUNT
12111201 2/1/2009 66600.00
12111201 8/31/2009 66600.00
12111201 7/29/2008 133200.00
12111201 5/19/2009 66600.00
Мне нужно получить сумму за конкретный 2009 год, т.е. с 1/31/2009 по 31/12/2009.
Как я получу данные за год? Поле date1 находится в формате даты в oracle. Я использую pl sql developer
Ответ №1:
Пока у date1 нет компонента time, вы могли бы использовать:
where date1 between date '2009-01-01' and '2009-12-31'
Это может использовать индекс для date1. Другим решением (которое не могло использовать простой индекс для date1) является:
where trunc(date1,'YYYY') = date '2009-01-01'
Ответ №2:
Этот запрос суммирует столбец AMT за данный год. Включение ГОДА в результат необязательно; если вы этого не хотите, вам также не понадобится предложение GROUP BY.
select to_char(date1, 'YYYY') as year
, sum(amount) as year_total
from your_table
where date1 between to_date('01-JAN-2009', 'DD-MON-YYYY')
and to_date('31-DEC-2009 23:59:59', 'DD-MON-YYYY HH24:MI:SS')
group by to_char(date1, 'YYYY')
/
Запрос предполагает, что DATE1 имеет тип данных DATE и включает элемент time (отсюда дополнительное форматирование в AND arm предложения BETWEEN). Если DATE1 достаточно плохо обработан, чтобы быть строкой, самый простой способ — сначала преобразовать его в дату.
Комментарии:
1. TRUNC(date1,’YY’) является альтернативой TO_CHAR
Ответ №3:
with sampleData as(
select 12111201 ACT_NO, to_date('2/1/2009' ,'mm/dd/rrrr') DATE1 , 66600.00 AMOUNT from dual union all
select 12111201 ACT_NO, to_date('8/31/2009','mm/dd/rrrr') DATE1 , 66600.00 AMOUNT from dual union all
select 12111201 ACT_NO, to_date('7/29/2008','mm/dd/rrrr') DATE1 , 133200.00 AMOUNT from dual union all
select 12111201 ACT_NO, to_date('5/19/2009','mm/dd/rrrr') DATE1 , 66600.00 AMOUNT from dual
)
select extract(year from date1) date1_year
,sum(amount) amount_summed
,count(distinct ACT_NO) distinctAccounts
, count(*) total_occurrences
from sampleData
/*где date1 между to_date(’01-JAN-2009′, ‘DD-MON-YYYY’)
и to_date(’31-DEC-2009 23:59:59′, ‘ ДД-ПН-ГГГГ ЧЧ24:MI: SS’)*/ —из ответа @APC
group by extract(year from date1)
/
DATE1_YEAR AMOUNT_SUMMED DISTINCTACCOUNTS TOTAL_OCCURRENCES
---------------------- ---------------------- ---------------------- ----------------------
2008 133200 1 1
2009 199800 1 3
Вы также можете использовать извлечение(год из поля даты)
Хотя, если вы не хотите создавать индекс для функции, для фильтрации по году можно использовать @APC или @Tony Andrews’.