如何在HANA中排除全空行及优化日期维度销售采购查询
SAP HANA数据过滤问题解决方案
1. 如何排除所有列均为NULL值的数据行?
要剔除表中所有列都为NULL的行,有两种简单可靠的实现方式:
- 明确列判断法:直接通过逻辑条件检查每一列,确保不是所有列都为空。假设你的表包含
col1、col2、col3三列,写法如下:
这种方式逻辑清晰,适合列数较少的场景,可读性强。SELECT * FROM your_table WHERE NOT (col1 IS NULL AND col2 IS NULL AND col3 IS NULL); - COALESCE函数简化法:利用
COALESCE返回第一个非NULL值的特性,如果所有列都为NULL,函数会返回NULL,以此作为判断依据:
这种写法更简洁,当需要检查的列数较多时,能大幅缩短代码长度。SELECT * FROM your_table WHERE COALESCE(col1, col2, col3) IS NOT NULL;
2. 你的销售/采购日期查询的针对性调整
核心需求:保留那些至少有销售数据或采购数据的日期行,仅剔除两者都为空的日期。你之前尝试的CONCAT和简单IS NOT NULL方法出错,原因在于:
CONCAT(Sales, Purchases)只要其中一个参数是NULL,结果就会是NULL,和空字符串''比较时,会误把“有销售无采购”或“有采购无销售”的有效行也过滤掉;- 如果用
Sales IS NOT NULL AND Purchases IS NOT NULL,又会错误剔除仅单一列有值的行,不符合你的业务需求。
修改后的完整查询代码
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 NOT (:TBLSALES."Sales" IS NULL AND :TBLPURCHASE."Purchase" IS NULL); End
逻辑说明
这里的WHERE NOT (Sales IS NULL AND Purchase IS NULL)等价于WHERE Sales IS NOT NULL OR Purchase IS NOT NULL,两种写法都能精准实现你的需求:只要销售或采购任意一列有值(哪怕另一列为NULL),就保留该行;只有当两者都为空时才剔除。
你也可以用COALESCE函数简化这个条件,效果完全一致:
WHERE COALESCE(:TBLSALES."Sales", :TBLPURCHASE."Purchase") IS NOT NULL;
内容的提问来源于stack exchange,提问作者Kith
相关产品推荐
相关产品推荐

