Oracle DB - отчет о группировке нелинейного времени по одному запросу (1 день, 1 неделя, 1 месяц, 3 месяца, всего) - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь создать отчет, который по сути представляет собой один запрос, который объединяет выходные данные этих запросов:

select count(*) from my_table where createddate >= CURRENT_DATE - 1;
select count(*) from my_table where createddate >= CURRENT_DATE - 7;
select count(*) from my_table where createddate >= CURRENT_DATE - 30;
select count(*) from my_table where createddate >= CURRENT_DATE - 90;
select count(*) from my_table;

Так, чтобы выходные данные были похожи на:

Time_Period   Count
===================
Yesterday        5
Last Week       20
Last Month      50
Last 90 Days   100
Total         5000

Мне удалось построить несколько запросов линейных временных рядов (по дням, по неделям, по месяцам и т. Д. c). Но не повезло в том, что удалось построить нелинейный отчетный запрос.

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Вы можете легко поместить результаты в отдельные столбцы:

select sum(case when createddate >= CURRENT_DATE - 1 then 1 else 0 end) as yesterday,
       sum(case when createddate >= CURRENT_DATE - 7 then 1 else 0 end) as last_week,
       sum(case when createddate >= CURRENT_DATE - 30 then 1 else 0 end) as last_month,
       sum(case when createddate >= CURRENT_DATE - 90 then 1 else 0 end) as last_90days,
       count(*) as total
from my_table;

Если вы хотите разделить строки, вы можете отключить вышеперечисленное или просто использовать union all:

select 'Yesterday' as which, count(*) from my_table where createddate >= CURRENT_DATE - 1
union all
select 'Last week', count(*) from my_table where createddate >= CURRENT_DATE - 7
union all
select 'Last month', count(*) from my_table where createddate >= CURRENT_DATE - 30
union all
select 'Last 90 days', count(*) from my_table where createddate >= CURRENT_DATE - 90
union all
select 'Total', count(*) from my_table;
0 голосов
/ 13 апреля 2020

Одним из вариантов будет использование Dynami c Запрос в PL / SQL вместе с определением массивов для дневных периодов и их буквальными пояснениями:

SQL> set serveroutput on
SQL> declare  
 v_sql    varchar2(250):='select count(*) from my_table where createddate >= current_date - :day'; 
 v_prd    owa.nc_arr;
 v_str    owa.vc_arr;   
 v_amount int;
begin
 v_prd(1) := 1;  v_prd(2) := 7; v_prd(3) := 30; v_prd(4) := 90; v_prd(5) := 100000;
 v_str(1) := 'Yesterday';  v_str(2) := 'Last Week'; v_str(3) := 'Last Month'; 
 v_str(4) := 'Last 90 Days'; v_str(5) := 'Total';   

     dbms_output.put_line('Time_Period   Count');
     dbms_output.put_line('===================');  
 for i in 1..5 
 loop
     execute immediate v_sql into v_amount using v_prd(i); 
     dbms_output.put_line(rpad(v_str(i),14,' ')||v_amount);  
 end loop;   
end;  
/

, где значение v_prd(5) может быть равно можно содержать все записи таблицы.

0 голосов
/ 13 апреля 2020

Вы можете поместить смещения в строки с помощью union all, а затем left join с таблицей, например:

select
    o.time_period,
    count(t.created) cnt
from (
    select 'yesterday' time_period, 1 offs
    union all select 'last week', 7
    union all select 'last month', 30
    union all select 'last 90 days', 90
    union all select 'total', null
) o
left join mytable t on o.offs is null or t.created >= current_date - o.offs
group by o.time_period
...