我试图查询客户当前的产品价格表。每个客户记录最多有3个价格代码。 Price_code是第一个价格。如果某个项目不在该列表上或价格已过期,则系统会查看Price_code_2,然后是Price_code_3。除此之外,每个客户都可以拥有一个覆盖所有3个价格代码的客户部件记录。我曾为客户部分记录和price_code条目工作的查询,但忽略了price_code_2和price_code_3。以下示例中的客户具有所有3个价格代码的客户部件定价和值。
declare @Customer as varchar(8)
, @Today as date
set @Customer = 'tre001'
set @Today = GETDATE()
select distinct SOFCM.CUSTOMER_ID
, CUSTOMER_NAME
, ICFPM.PART_ID
, ICFPM.PART_DESC
, ISNULL((case when SOFCP.QUOTE_UNIT_PRIC IS not null then SOFCP.QUOTE_UNIT_PRIC
when SOFCM.PRICE_CODE IS not null then PC1.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_2 is not null then PC2.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_3 is not null then PC3.SO_UNIT_PRICE
end), SOFPL.SO_UNIT_PRICE ) as 'Default_Price'
, ISNULL((case when SOFCP.QUOTE_UNIT_PRIC IS not null then 'CustPart'
when SOFCM.PRICE_CODE IS not null then PC1.PRICE_CODE
when SOFCM.PRICE_CODE_2 is not null then PC2.PRICE_CODE
when SOFCM.PRICE_CODE_3 is not null then PC3.PRICE_CODE
end), 'LP' ) as 'Default_Price_Code'
from SOFCM
cross join (select distinct PART_ID
, PART_DESC
from ICFPM
where PART_ID like 'cm-%') ICFPM
left outer join SOFCP
on SOFCM.CUSTOMER_ID = SOFCP.CUSTOMER_ID and ICFPM.PART_ID = SOFCP.PART_ID and SOFCP.DATE_LAST_QUOTE <> ''
left outer join SOFPL PC1
on SOFCM.PRICE_CODE = PC1.PRICE_CODE and ICFPM.PART_ID = PC1.PART_ID and PC1.EFFECTIVE_DATE <= @Today and PC1.END_DATE >= @Today
left outer join SOFPL PC2
on SOFCM.PRICE_CODE_2 = PC2.PRICE_CODE and ICFPM.PART_ID = PC2.PART_ID and PC2.EFFECTIVE_DATE <= @Today and PC2.END_DATE >= @Today
left outer join SOFPL PC3
on SOFCM.PRICE_CODE_3 = PC3.PRICE_CODE and ICFPM.PART_ID = PC3.PART_ID and PC3.EFFECTIVE_DATE <= @Today and PC3.END_DATE >= @Today
left outer join SOFPL
on ICFPM.PART_ID = SOFPL.PART_ID and SOFPL.PRICE_CODE = '12N' and SOFPL.EFFECTIVE_DATE <= @Today and SOFPL.END_DATE >= @Today
where SOFCM.CUSTOMER_ID = @Customer
and ISNULL((case when SOFCP.QUOTE_UNIT_PRIC IS not null then SOFCP.QUOTE_UNIT_PRIC
when SOFCM.PRICE_CODE IS not null then PC1.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_2 is not null then PC2.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_3 is not null then PC3.SO_UNIT_PRICE
end), SOFPL.SO_UNIT_PRICE ) is not null
答案 0 :(得分:0)
奇怪的表格设计...您在上面写的查询意味着当有效期不同时,价格代码也会发生变化。无论如何,问题是 SOFCM.PRICE_CODE,SOFCM.PRICE_CODE_2,SOFCM.PRICE_CODE_3始终返回NOT NULL。 请检查PC1.PRICE_CODE,PC2.PRICE_CODE,PC3.PRICE_CODE。 现在,您想首先评估quote_unit_price吗? 也许它有效。
select distinct SOFCM.CUSTOMER_ID
, CUSTOMER_NAME
, ICFPM.PART_ID
, ICFPM.PART_DESC
/*
, ISNULL((case when SOFCP.QUOTE_UNIT_PRIC IS not null then SOFCP.QUOTE_UNIT_PRIC
when SOFCM.PRICE_CODE IS not null then PC1.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_2 is not null then PC2.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_3 is not null then PC3.SO_UNIT_PRICE
end), SOFPL.SO_UNIT_PRICE ) as 'Default_Price'
, ISNULL((case when SOFCP.QUOTE_UNIT_PRIC IS not null then 'CustPart'
when SOFCM.PRICE_CODE IS not null then PC1.PRICE_CODE
when SOFCM.PRICE_CODE_2 is not null then PC2.PRICE_CODE
when SOFCM.PRICE_CODE_3 is not null then PC3.PRICE_CODE
end), 'LP' ) as 'Default_Price_Code'
*/
,case when PC1.PRICE_CODE is not null then PC1.SO_UNIT_PRICE
when PC2.PRICE_CODE is not null then PC2.SO_UNIT_PRICE
when PC3.PRICE_CODE is not null then PC3.SO_UNIT_PRICE
end as 'Default_Price'
, ISNULL((case when PC1.PRICE_CODE is not null then PC1.PRICE_CODE
when PC2.PRICE_CODE is not null then PC2.PRICE_CODE
when PC3.PRICE_CODE is not null then PC3.PRICE_CODE
end), 'LP' ) as 'Default_Price_Code'
, SOFCP.QUOTE_UNIT_PRIC
from SOFCM
cross join (select distinct PART_ID
, PART_DESC
from ICFPM
where PART_ID like 'cm-%') ICFPM
left outer join SOFCP
on SOFCM.CUSTOMER_ID = SOFCP.CUSTOMER_ID and ICFPM.PART_ID = SOFCP.PART_ID and SOFCP.DATE_LAST_QUOTE <> ''
left outer join SOFPL PC1
on SOFCM.PRICE_CODE = PC1.PRICE_CODE and ICFPM.PART_ID = PC1.PART_ID and PC1.EFFECTIVE_DATE <= @Today and PC1.END_DATE >= @Today
left outer join SOFPL PC2
on SOFCM.PRICE_CODE_2 = PC2.PRICE_CODE and ICFPM.PART_ID = PC2.PART_ID and PC2.EFFECTIVE_DATE <= @Today and PC2.END_DATE >= @Today
left outer join SOFPL PC3
on SOFCM.PRICE_CODE_3 = PC3.PRICE_CODE and ICFPM.PART_ID = PC3.PART_ID and PC3.EFFECTIVE_DATE <= @Today and PC3.END_DATE >= @Today
left outer join SOFPL
on ICFPM.PART_ID = SOFPL.PART_ID and SOFPL.PRICE_CODE = '12N' and SOFPL.EFFECTIVE_DATE <= @Today and SOFPL.END_DATE >= @Today
where SOFCM.CUSTOMER_ID = @Customer
/*
and ISNULL((case when SOFCP.QUOTE_UNIT_PRIC IS not null then SOFCP.QUOTE_UNIT_PRIC
when SOFCM.PRICE_CODE IS not null then PC1.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_2 is not null then PC2.SO_UNIT_PRICE
when SOFCM.PRICE_CODE_3 is not null then PC3.SO_UNIT_PRICE
end), SOFPL.SO_UNIT_PRICE ) is not null
*/
and case when PC1.PRICE_CODE is not null then PC1.SO_UNIT_PRICE
when PC2.PRICE_CODE is not null then PC2.SO_UNIT_PRICE
when PC3.PRICE_CODE is not null then PC3.SO_UNIT_PRICE
end is not null