仅当没有其他记录时才保留空记录

时间:2019-10-17 20:14:30

标签: sql sql-server

给出下表,我如何编写一个查询,将每个类别和代码保留在其中,如果没有关于“ product from”的值的记录,则仅记录“ product from”为空的记录?

> Category | Code | Product From | Product To
> :--------|------|--------------|----------
> Sports   |  A   |     ProdA    |    ProdB
> Sports   |  A   |     NULL     |    ProdB
> Sports   |  A   |     ProdX    |    ProdB
> Sports   |  B   |     NULL     |    ProdB
> Sports   |  C   |     ProdC    |    ProdD
> Sports   |  C   |     NULL     |    ProdD

由于代码A的ProdB有两个“乘积来自”,因此应删除以“乘积来自”为NULL的行。对于代码C,情况相同,但是对于代码B,应保留ProdB,因为它没有“乘积源”。

预期结果:

> Category | Code | Product From | Product To
> :--------|------|--------------|----------
> Sports   |  A   |     ProdA    |    ProdB
> Sports   |  A   |     ProdX    |    ProdB
> Sports   |  B   |     NULL     |    ProdB
> Sports   |  C   |     ProdC    |    ProdD

2 个答案:

答案 0 :(得分:0)

您可以在子查询中使用窗口函数来检查在具有相同code的记录组中所有记录是否为空,并在外部查询中应用逻辑:

select category, code, product_from, product_to
from (
    select
        t.*
        max(product_from) over(partition by code) max_product_from
    from mytable t
) x 
where 
    product_from is not null
    or max_product_from is null

如果分区中的所有product_fromnull,则窗口max返回null

Demo on DB Fiddle

category | code | product_from | product_to
:------- | :--- | :----------- | :---------
Sports   | A    | ProdA        | ProdB     
Sports   | B    | null         | ProdB     
Sports   | C    | ProdC        | ProdD     

答案 1 :(得分:0)

另一种选择是使用WITH TIES

示例

Select top 1 with ties *
 From  mytable
 Order by row_number() over (Partition by Category,Code,Product_To Order by Product_From desc)

返回

Category    Code    Product_From    Product_To
Sports      A       ProdA           ProdB
Sports      B       NULL            ProdB
Sports      C       ProdC           ProdD