Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL筛选器将重复的值记录替换为单个自定义值记录_Sql_Sql Server_Replace_Duplicates - Fatal编程技术网

SQL筛选器将重复的值记录替换为单个自定义值记录

SQL筛选器将重复的值记录替换为单个自定义值记录,sql,sql-server,replace,duplicates,Sql,Sql Server,Replace,Duplicates,我试图创建一个报告,显示按门店位置(门店ID)购买的商品(门店商品)数量 我的问题是,当一个不同的门店同时购买产品a和产品b时,我需要报告显示该门店ID的一条记录,其中门店ID为“产品a”,而不是两条记录具有相同的门店ID和产品a和产品b。 但是,如果一个不同的门店只购买产品a或产品B(但不是两者),那么它将显示该门店ID的一条记录以及它现在通常购买的产品 左边是我现在得到的结果,右边是我想要的结果: 我怎样才能达到这个结果 谢谢 在Microsoft SQL Server中,您可以使用CTE

我试图创建一个报告,显示按门店位置(门店ID)购买的商品(门店商品)数量

我的问题是,当一个不同的门店同时购买产品a和产品b时,我需要报告显示该门店ID的一条记录,其中门店ID为“产品a”,而不是两条记录具有相同的门店ID和产品a和产品b。 但是,如果一个不同的门店只购买产品a或产品B(但不是两者),那么它将显示该门店ID的一条记录以及它现在通常购买的产品

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

我怎样才能达到这个结果


谢谢

在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

在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
。。。这是另一个处理示例数据的肮脏技巧;)


。。。这是另一个处理示例数据的肮脏技巧;)

在对答案的评论中,您正在更正您的请求。当同一个商店也有产品A时,您希望抑制产品B。结果中应保留所有其他行。至少我现在是这样理解的

实现这一点的一种方法是使用
不在
(或
不存在
)子句:


在对答案的评论中,您正在更正您的请求。当同一个商店也有产品A时,您希望抑制产品B。结果中应保留所有其他行。至少我现在是这样理解的

实现这一点的一种方法是使用
不在
(或
不存在
)子句:



啊??您能告诉我们输出的预期结果吗?@Dalorzo我在主帖子上添加了一个预期的输出图像。@Kashifkureshi我现在只有基本的select语句和过滤器。我甚至不知道如何在正确的方向上使用它。您是否有产品表,并且它是否按照您希望您的产品相互覆盖的顺序?也就是说,如果表中product_A在product_B之前,那么product_A将是报告的产品(如果两者都存在)?您使用的是什么数据库服务器?啊?您能告诉我们输出的预期结果吗?@Dalorzo我在主帖子上添加了一个预期的输出图像。@Kashifkureshi我现在只有基本的select语句和过滤器。我甚至不知道如何在正确的方向上使用它。您是否有产品表,并且它是否按照您希望您的产品相互覆盖的顺序?也就是说,如果表中product_A在product_B之前,则product_A将是报告的产品(如果两者都存在)?您使用的是什么数据库服务器?非常感谢您的帮助!这是我的错,但我忘了提到除product_A和product_B之外还有store_product值。当存在重复的store_ID时,此查询也会将其他store_products(如product_C)更改为product_A。如果两个重复项都是“product_A”,则我只需要将重复的store_ID替换为单个记录“product_B”如果存在重复的门店ID,则表示“product_A”和“product_D”“那么我希望两张唱片都能出现。很抱歉造成混乱,希望您能帮忙。谢谢非常感谢你的帮助!这是我的错,但我忘了提到除product_A和product_B之外还有store_product值。当存在重复的store_ID时,此查询也会将其他store_products(如product_C)更改为product_A。如果两个重复项都是“product_A”,则我只需要将重复的store_ID替换为单个记录“product_B”如果存在重复的门店ID,则表示“product_A”和“product_D”“那么我希望两张唱片都能出现。很抱歉造成混乱,希望您能帮忙。谢谢谢谢你的回复!我想用product_A替换而不是抑制product_B,当同一个商店_ID也有product_A时。我相信您的方法只是从计数角度删除product_B,而用product_A替换时,计数将保持不变,只是现在更改为product_A类别。如果:商店只有(其中一个)产品B或产品a或产品C,则不会进行任何更改;或者当一家商店既有产品C又有产品a时;或者当商店有C和B产品时;当一个商店有产品a和产品B时,只有这样,产品B才会替换为产品a。查询将列出所有商店和产品。不算。当商店同时拥有产品a和产品B时,产品B不显示。这似乎符合你的要求。你唯一没有提到的情况是当一家商店有产品a、产品B和产品C时。我会展示产品a和产品C,因为商店有产品a和产品B,所以只展示产品a。这和你想要的不同吗?您是否尝试过其中一个查询?结果是否与您正在寻找的结果不同?如果是,怎么做?我不希望它“不显示”。相反,我想让它显示两个product_A的实例。当一家商店同时拥有product_A和product_B时,product_B会变为product_A,所以现在商店拥有两个product_A计数,而不是一个product_A和一个product_B当一家商店拥有product_A、product_B和product_C时,然后product_B被product_A替换,所以现在商店有两个product_A计数和一个product_C计数,但我的查询就是这样做的。产品B不显示,但产品A和产品C显示。我看不出我的查询与您想要的结果或您在请求中显示的结果有什么不同。再说一遍:你试过我的问题了吗?他们的结果和你想要的不同吗?如果是的话,有什么不同?谢谢你的回复!当同一个商店的ID也有产品A时,我想用产品A替换而不是压制产品B。我相信你的方法w
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')
);