SQL过滤器用一个自定义值记录替换重复值记录

时间:2017-09-07 21:03:29

标签: sql sql-server replace duplicates

我正在尝试创建一个报告,显示按商店位置(store_ID)购买的商品数量(store_Product)。

我的问题是,当不同的商店位置同时购买product_a和product_b时,我需要报告显示该store_ID的一条记录,其中store_Product为“product_A”,而不是具有两条记录具有相同的store_ID以及product_A和product_B。 但是,如果不同的商店位置仅购买product_A OR product_B(但不是两者),那么它将显示该store_ID的一条记录以及它现在购买的产品。

左边是我现在得到的,右边是我想要的结果:

enter image description here

如何实现这一结果?

谢谢!

3 个答案:

答案 0 :(得分:1)

在Microsoft SQL Server中,您可以使用CTE

来实现此目的
CREATE TABLE #temp (
  store_id int,
  store_product varchar(25)
)

INSERT INTO #temp
  VALUES (100, 'product_A')
  , (100, 'product_B')
  , (200, 'product_B')
  , (300, 'product_A')
  , (400, 'product_B')
  , (400, 'product_A')


;WITH cte
AS (SELECT
  *,
  ROW_NUMBER() OVER (PARTITION BY store_id ORDER BY store_id, store_product) AS rn
FROM #temp)
SELECT
  store_id , store_product 
FROM cte
WHERE rn = 1

DROP TABLE #temp

答案 1 :(得分:1)

select store_id, min(store_product) as store_product
from table_name
group by store_id;

......这是另一个可以处理样本数据的肮脏技巧;)

答案 2 :(得分:0)

在对答案的评论中,您正在更正您的请求。您希望在同一商店也有product_A时禁止product_B。所有其他行应保留在结果中。至少这是我现在理解的方式。

实现此目的的一种方法是使用NOT IN(或NOT EXISTS)子句:

select
  store_id,
  store_product
from mytable
where store_product <> 'product_B'
   or store_id not in (select store_id from mytable where store_product = 'product_A');

或者如果您发现更具可读性:

select
  store_id,
  store_product
from mytable
where not
(
  store_product = 'product_B' and
  store_id in (select store_id from mytable where store_product = 'product_A')
);