如何排除 HANA 中所有列中具有空值的行?
How to exclude rows with null values in all columns in HANA?
如果某个日期没有销售和采购,我需要省略以下查询的行。我试过 where Concat(Sales,Purchases) <> '' and Is not null functions。但即使一列具有空值,它也会省略行。这个怎么做。我的查询供您参考,
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
好的,所以您使用 SERIES_GENERATE_TIMESTAMP
获取 FromD
日期和 ToD
日期之间的所有日期的列表。为避免不必要的数据类型转换,可以改用 SERIES_GENERATE_DATE
函数。
然后您使用 LEFT OUTER JOIN
加入采购 TBLPURCHASES
和销售 TBLSALES
。使用 table 变量是一个不错的选择,但是 ORDER BY
对于剩余的处理不是必需的。
每当其他 table 中的日期不匹配时,从它们(:TBLSALES."Sales"
和 :TBLPURCHASE."Purchase"
)投影的列将是 NULL
(不仅仅是空字符串 ''
)。
使用 COALESCE
函数可以轻松地为 NULL
测试多个列。
综上所述,我们可以这样写代码:
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;
如果某个日期没有销售和采购,我需要省略以下查询的行。我试过 where Concat(Sales,Purchases) <> '' and Is not null functions。但即使一列具有空值,它也会省略行。这个怎么做。我的查询供您参考,
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
好的,所以您使用 SERIES_GENERATE_TIMESTAMP
获取 FromD
日期和 ToD
日期之间的所有日期的列表。为避免不必要的数据类型转换,可以改用 SERIES_GENERATE_DATE
函数。
然后您使用 LEFT OUTER JOIN
加入采购 TBLPURCHASES
和销售 TBLSALES
。使用 table 变量是一个不错的选择,但是 ORDER BY
对于剩余的处理不是必需的。
每当其他 table 中的日期不匹配时,从它们(:TBLSALES."Sales"
和 :TBLPURCHASE."Purchase"
)投影的列将是 NULL
(不仅仅是空字符串 ''
)。
使用 COALESCE
函数可以轻松地为 NULL
测试多个列。
综上所述,我们可以这样写代码:
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;