首页 > 解决方案 > 只有在没有其他记录时才保留空记录

问题描述

鉴于下表,我如何编写一个查询,我为每个类别和代码保留,如果没有“产品来自”值的记录,则只有“产品来自”的记录为空?

> 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,因为它没有“Product From”。

预期结果:

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

标签: sqlsql-server

解决方案


另一种选择是使用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

推荐阅读