【发布时间】:2020-01-24 10:37:53
【问题描述】:
我目前正在设计一个SQL 报告,从ERP system 内部运行。这段代码背后的想法是,将所有 AR 打开项目,所有这些字段都放在 SELECT statement 中,并且能够选择要运行报告的对象,通过我描述的各种 WHERE 子句选项。
我还附上了 ERP system 内的表格,带有“参数”名称,以及用户必须将报告运行为...的选项...
根据搜索条件,我无法让所有这些 CASE AND、OR 声明发挥作用,或提供特定数据。 p>
我什至不确定我是否在 WHERE 子句代码上正确显示了参数(使用“< >”,或按字段名称,或使用 ' ' , ...)
SELECT DISTINCT
e1.rel_value AS Cust_Rep_Grp,
o1.description AS Cust_Rep_Grp_Name,
r.main_apar_id AS Head_Office,
o2.description AS Head_Office_Name,
s.apar_id AS CustID,
o3.description AS Cust_ID_Name,
s.voucher_no,
s.dim_2 AS BookingNo,
h.ext_ord_ref AS YourRef,
n.booking_day_fx AS Booking_date,
n.check_in_date_fx AS Check_in_date,
n.check_out_date_fx AS Check_out_date,
s.voucher_date AS Invoice_date,
s.due_date,
i.art_descr AS Hotel_name,
o.description AS Destination,
e2.rel_value AS City,
o.description AS City_name,
e.rel_value AS Country_code,
o4.description AS Country_name,
n.guest_fx AS Client_name,
n.pax_fx,
s.currency,
i.disc_percent AS Comm_percentage,
s.cur_amount AS Net_amt,
s.rest_curr AS Due_now,
s.voucher_type,
s.order_id
FROM acutrans s
LEFT OUTER JOIN acuheader r
ON r.client = s.client
AND s.apar_id = r.apar_id
LEFT OUTER JOIN asoheader h
ON h.client = s.client
AND h.order_id = s.order_id
LEFT OUTER JOIN asodetail i
ON i.client = s.client
AND i.order_id = s.order_id
INNER JOIN algvirelvalue e2
ON e2.client= s.client
AND e2.rel_attr_id='ZZ06'
AND e2.related_attr = 'CITY'
AND i.article = e2.article
LEFT OUTER JOIN aglrelvalue e
ON e.client= s.client
AND e.attribute_id = 'ZZ06'
AND e.rel_attr_id = 'C9'
AND e.att_value = e2.rel_value
LEFT OUTER JOIN aglrelvalue e1
ON e1.client = s.client
AND e1.attribute_id = 'A4'
AND e1.rel_attr_id = 'ZG06'
AND e1.att_value = s.apar_id
LEFT OUTER JOIN agldescription o
ON o.client= s.client
AND o.attribute_id='ZZ06'
AND o.dim_value = e2.rel_value
LEFT OUTER JOIN agldescription o1
ON o1.client= s.client
AND o1.attribute_id='ZG06'
AND o1.dim_value = e1.rel_value
LEFT OUTER JOIN agldescription o2
ON o2.client= s.client
AND o2.attribute_id='A4'
AND o2.dim_value = r.main_apar_id
LEFT OUTER JOIN agldescription o3
ON o3.client= s.client
AND o3.attribute_id='A4'
AND o3.dim_value = s.apar_id
LEFT OUTER JOIN agldescription o4
ON o4.client= s.client
AND o4.attribute_id='C9'
AND o4.dim_value = e.rel_value
LEFT OUTER JOIN afxbooking_gen n
ON s.dim_2 = n.dim_value
AND s.client = n.client
AND n.attribute_id = 'ZZ01'
WHERE
CASE WHEN '<checkin_from>' IN (' ','') THEN '*' ELSE '<checkin_from>' END LIKE n.check_in_date_fx
AND
CASE WHEN n.check_in_date_fx IN (' ','') THEN '*' ELSE n.check_in_date_fx END LIKE n.check_in_date_fx
OR
CASE WHEN s.voucher_date IN (' ','') THEN '*' ELSE s.voucher_date END LIKE s.voucher_Date
AND
CASE WHEN s.voucher_date IN (' ','') THEN '*' ELSE s.voucher_date END LIKE s.voucher_Date
OR
CASE WHEN n.booking_day_fx IN (' ','') THEN '*' ELSE n.booking_day_fx END LIKE n.booking_day_fx
AND
CASE WHEN n.booking_day_fx IN (' ','') THEN '*' ELSE n.booking_day_fx END LIKE n.booking_day_fx
OR
CASE WHEN n.check_out_date_fx IN (' ','') THEN '*' ELSE n.check_out_date_fx END LIKE n.check_out_date_fx
AND
CASE WHEN n.check_out_date_fx IN (' ','') THEN '*' ELSE n.check_out_date_fx END LIKE n.check_out_date_fx
OR
CASE WHEN s.apar_id IN (' ','') THEN '*' ELSE s.apar_id END LIKE s.apar_id
AND
CASE WHEN s.apar_id IN (' ','') THEN '*' ELSE s.apar_id END LIKE s.apar_id
OR
CASE WHEN o3.description IN (' ','') THEN '*' ELSE o3.description END LIKE o3.description
OR
CASE WHEN e1.rel_value IN (' ','') THEN '*' ELSE e1.rel_value END LIKE e1.rel_value
AND
CASE WHEN e1.rel_value IN (' ','') THEN '*' ELSE e1.rel_value END LIKE e1.rel_value
OR
CASE WHEN o1.description IN (' ','') THEN '*' ELSE o1.description END LIKE o1.description
OR
CASE WHEN r.main_apar_id IN (' ','') THEN '*' ELSE r.main_apar_id END LIKE r.main_apar_id
AND
CASE WHEN r.main_apar_idIN (' ','') THEN '*' ELSE r.main_apar_id END LIKE r.main_apar_id
OR
CASE WHEN o2.description IN (' ','') THEN '*' ELSE o2.description END LIKE o2.description
OR
CASE WHEN s.dim_2 IN (' ','') THEN '*' ELSE s.dim_2 END LIKE s.dim_2
AND
CASE WHEN s.dim_2 IN (' ','') THEN '*' ELSE s.dim_2 END LIKE s.dim_2
OR
CASE WHEN e.rel_value IN (' ','') THEN '*' ELSE e.rel_value END LIKE e.rel_value
OR
CASE WHEN s.currency IN (' ','') THEN '*' ELSE s.currency END LIKE s.currency
OR
CASE WHEN n.guest_fx IN (' ','') THEN '*' ELSE n.guest_fx END LIKE n.guest_fx
OR
CASE WHEN s.voucher_no IN (' ','') THEN '*' ELSE s.voucher_no END LIKE s.voucher_no
AND
CASE WHEN s.voucher_no IN (' ','') THEN '*' ELSE s.voucher_no END LIKE s.voucher_no
OR
CASE WHEN h.ext_ord_ref IN (' ','') THEN '*' ELSE h.ext_ord_ref END LIKE h.ext_ord_ref
OR
CASE WHEN s.order_id IN (' ','') THEN '*' ELSE s.order_id END LIKE s.order_id
AND
CASE WHEN s.order_id IN (' ','') THEN '*' ELSE s.order_id END LIKE s.order_id
【问题讨论】:
-
您从哪个平台或语言执行此查询? where 子句不起作用,因为它与自身匹配(这始终是正确的,您根本没有比较参数
-
您是说当参数值为空时,您不想对该列进行过滤?
-
@ChrisSchaller 来自 Unit4 Business World,报告引擎。如何在 WHERE CLAUSE 中正确编写参数,以允许用户选择 1 或各种?谢谢
-
@ChrisSchaller 当参数值为空时,将其全部从该参数中取出...但仍然过滤用户输入的任何参数
-
您已经组合了日期边界过滤器和文本过滤器。日期过滤器是否应该完全匹配,或者您是否希望用户指定日期范围,以便返回
checkin日期介于checkin_from和checkin_to之间的所有记录?
标签: sql left-join case where-clause