Хорошо, поэтому вы используете SERIES_GENERATE_TIMESTAMP
, чтобы получить список всех дат между вашей датой FromD
и датой ToD
. Чтобы избежать ненужного преобразования типов данных, вместо этого можно использовать функцию SERIES_GENERATE_DATE
.
Затем вы используете LEFT OUTER JOIN
s, чтобы присоединиться к покупкам TBLPURCHASES
и продажам TBLSALES
. Использование табличных переменных - хороший вариант, но ORDER BY
s не требуются для оставшейся обработки.
Всякий раз, когда нет совпадения для даты в других из этих таблиц, столбцы, которые проецируются из них ( :TBLSALES."Sales"
и :TBLPURCHASE."Purchase"
) будут NULL
(не просто пустая строка ''
).
Проверка нескольких столбцов для NULL
может быть легко выполнена с помощью функции COALESCE
.
Взяв это вместе, мы можем написать код так:
do
begin
declare FromD Date := '20200201';
declare ToD Date := '20200228';
daily_sales = select
"DocDate" as "SalesDate"
, SUM("DocTotal") as "Sales_SUM"
from
"TNP_AGE_LIVE"."OINV"
where
"DocDate" between :FromD and :ToD
group by
"DocDate";
daily_purchases = select
"DocDate" as "PurchaseDate"
, Sum("DocTotal") as "Purchases_SUM"
from
"TNP_AGE_LIVE"."OPCH"
where
"DocDate" between :FromD and :ToD
group by
"DocDate";
select
sgd.GENERATED_PERIOD_START as "Date"
, s."Sales_SUM"
, p."Purchases_SUM"
from
SERIES_GENERATE_DATE('INTERVAL 1 DAY', :FromD, :ToD ) sgd
left outer join :daily_sales s
on s."SalesDate" = sgd.GENERATED_PERIOD_START
left Join :daily_purchases p
on p."PurchasesDate" = sgd.GENERATED_PERIOD_START
where
coalesce(p."SalesDate", p."PurchasesDate") IS NOT NULL;
end;