基于层的T-SQL退货价格

时间:2015-07-30 23:05:00

标签: sql-server tsql

我试图查询客户当前的产品价格表。每个客户记录最多有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

1 个答案:

答案 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