Как вывести данные за квартал в зависимости от заданной даты?
Допустим в а , мы, в зависимости от полученной даты, выводим данные и в b выводим количество количество этих данных по месяцам.
with a as
(
select *
from table_1 t1
where trunc(t1, 'Q') = trunc(:add_data, 'Q') -- Полученная дата
),
b as
(
select table_id
, (select count(*)
from a
where t2.table_id = a.table_id) january -- Разбивка по месяцам
, (select count(*)
from a
where t2.table_id = a.table_id) february -- Разбивка по месяцам
, (select count(*)
from a
where t2.table_id = a.table_id) march -- Разбивка по месяцам
...
from table_2 t2
Как в запросе можно вывести только месяцы, которые относяться к определённому кварталу в зависимости от искомой даты?
Например:
trunc(to_date('01.02.2021', 'dd.mm.yyyy'),'Q')
1 кв
декабрь январь февраль
Ответы (2 шт):
как в селекте можно вывести только месяцы, которые относяться к определённому кварталу в зависимости от искомой даты
Вот так, искоммая дата 2021-02-01, это первый квартал с 3 первыми месяцами года:
create table t1 (id, dt) as
select rownum, date'2021-01-01'+rownum-1
from dual connect by level<=365
/
with a as (
select trunc (dt, 'mm') mm
from t1
where trunc (dt, 'Q') = trunc (date'2021-02-01', 'Q')
)
select count (*) total, to_char (mm, 'Month') mon
from a
group by mm
order by mm
/
Результат:
TOTAL MON
---------- ------------------------------------
31 March
31 January
28 February
Судя по последней правке ТС, ожидается результат с транспонированием строк в столбцы.
Это можно достичь функцией PIVOT, но ввести только дату недостаточно, имена месяцев, соответствующие этой дате, должны быть сформированы заране до парсинга запроса SQL интерпретатором. Другими словами, на чистом SQL и одним запросом задачу решить нельзя.
Вот пример на PL/SQL. Часть с формированием имён столбцов (FOR...LOOP), может быть аналогично аналогично реализована на любом языке в клиенте при формировании полного запроса.
var rc refcursor
declare
qmon date := trunc (date'2021-02-01', 'q');
cols varchar2 (96);
mons varchar2 (16);
begin
for i in 1..3 loop
mons := rtrim (to_char (add_months (qmon, (i-1)), 'Month'));
cols := cols||''''||mons||''' "'||mons||'",';
end loop;
cols := rtrim (cols, ',');
open :rcdata for q'[
select *
from (
select trim (to_char (dt, 'Month')) mon
from t1 where :qmon=trunc (dt, 'q'))
pivot (count (*) for mon in (]'||cols||'))' using qmon;
end;
/
Результат:
January February March
---------- ---------- ----------
31 28 31