我正在尝试创建一个报告,显示按商店位置(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的一条记录以及它现在购买的产品。
左边是我现在得到的,右边是我想要的结果:
如何实现这一结果?
谢谢!
答案 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')
);