Как исключить строки с нулевыми значениями во всех столбцах в HANA? - PullRequest
0 голосов
/ 09 апреля 2020

Мне нужно пропустить строки следующего запроса, если на дату нет продаж и покупок. Я пробовал, где Concat (Продажи, Закупки) <> '' и не пустые функции. Но он пропускает строки, даже если один столбец имеет нулевое значение. Как это сделать Вот мой запрос для вашей справки,

Do
Begin

Declare FromD Date; 
Declare ToD Date;

FromD := '20200201';
ToD := '20200228';

TBLSALES = Select "OINV"."DocDate",Sum("OINV"."DocTotal") as "Sales"
From "TNP_AGE_LIVE"."OINV"
where "OINV"."DocDate" between :FromD and :ToD 
Group by "OINV"."DocDate"
Order by "OINV"."DocDate";


TBLPURCHASE = Select "OPCH"."DocDate",Sum("OPCH"."DocTotal")as "Purchase"
From "TNP_AGE_LIVE"."OPCH"
where "OPCH"."DocDate" between :FromD and :ToD 
Group by "OPCH"."DocDate"
Order by "OPCH"."DocDate";

SELECT to_date(GENERATED_PERIOD_START) as "Date",:TBLSALES."Sales",:TBLPURCHASE."Purchase"
FROM SERIES_GENERATE_TIMESTAMP('INTERVAL 1 DAY', :FromD, :ToD )
Left Join :TBLSALES on :TBLSALES."DocDate"=to_date(GENERATED_PERIOD_START)
Left Join :TBLPURCHASE on :TBLPURCHASE."DocDate" = to_date(GENERATED_PERIOD_START)
/*where concat(:TBLSALES."Sales",:TBLPURCHASE."Purchase")<>''*/;
End

1 Ответ

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

Хорошо, поэтому вы используете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...