2015-07-08 2 views
1

У меня есть эта таблица:SQL графа/Sum на несколько групп

account | amount | date_time

Как получить следующий отчет?

count_0-10_days, amount_0-10_days, count_10-20_days, amount_10-20_days, count_20-30_days, amount_20-30_days

Я в настоящее время использую UNION и сделать несколько запросов к югу, но мне интересно, если есть лучший и самый эффективный способ сделать это?

+2

Можете ли вы предоставить расчеты, которые вы используете? то есть 0 - 10 дней current_date - date? – Nick

+0

Просьба показать образцы данных и ожидаемый результат выборки данных и вашего запроса. – OldProgrammer

+1

Условное агрегирование, например сумма (случай, когда дата <10 дней, а затем еще 1 конец 0) – jarlh

ответ

2

Вы пытались использовать Sum (Case) в своем избранном? Обязательно используйте правильный шаблон даты, если ваша дата является нестандартным форматом даты. Без образца данных это лучшее, что я могу предложить. Ниже вы можете сделать это для случая 0-10, повторить для других диапазонов дат, которые вы хотели бы.

Select 
    SUM(CASE WHEN [date_time] between TO_DATE([date_time], 'date pattern') AND TO_DATE([date_time], 'date pattern')-10 THEN 1 ELSE 0 END) AS 'count_0-10_days', 
    SUM(CASE WHEN [date_time] between TO_DATE([date_time], 'date pattern') AND TO_DATE([date_time], 'date pattern')-10 THEN amount ELSE 0 END) AS 'amount_0-10_days' 
From [Table_name] 
+0

'[date_time]' является недопустимым идентификатором в SQL. –

+0

Я использовал имена полей, предоставленные плакатом, и окружил их квадратными скобками, чтобы указать на их использование. Я не уверен, что имена полей, на которых представлен плакат, являются фактическими именами полей. Также Table_name также было псевдокодом. –

0
select start_date,end_date,(rownum-1)*10+1||'-'||rownum*10 days, amount 
from 
    (
     select dr.start_date,dr.end_date,sum(t.amount) amount 
      from (
        select ((trunc(to_date(<start_date>,'dd-mon-yyyy')))+(rownum-1)*10) start_date, 
         ((trunc(to_date(<start_date>,'dd-mon-yyyy')))+(rownum)*10)-1 end_date 
        from dual connect by rownum < 366 
       ) dr, <table_name> t 
     where 
      to_date(trunc(t.date_time), 'dd-mon-yyyy') between dr.start_date and dr.end_date 
     group by dr.start_date,dr.end_date 
    ); 
Смежные вопросы