2017-09-07 6 views
0

ストアの場所(store_ID)で購入したアイテム(store_Product)の数を示すレポートを作成しようとしています。重複する値レコードを単一のカスタム値レコードに置き換えるSQLフィルタ

私の問題は、別の店舗ロケーションがproduct_aとproduct_bの両方を購入した場合、store_IDが同じで、product_Aとproduct_Bの2つのレコードを持つ代わりに、store_Productがstore_Productのレコードをproduct_Aとして表示する必要があることです。 。 ただし、別の店舗の場所でのみproduct_A OR product_B(両方ではない)を購入すると、そのstore_IDのレコードと、通常どおり購入した商品が表示されます。左側に

は、私は今取得し、右側に午前何である私は、結果が見えるようにしたいものです。

enter image description here

どのように私はこの結果を達成することができますか?

ありがとうございます! Microsoft SQL Serverので

+0

ああ、これを達成するために

一つの方法は、NOT IN(またはNOT EXISTS)句を使用しているのですか?期待どおりの結果を出力できますか? – Dalorzo

+0

あなたはこれまでに何を試しましたか? –

+0

@Dalorzoメインの投稿に予想される出力イメージを追加しました。 –

答えて

1

、あなたが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 
+0

ありがとうございました!だからこれは私のせいですが、product_Aとproduct_B以外のstore_product値があることは言及していませんでした。 このクエリは、store_IDが重複している場合でも、他のstore_products(product_Cなど)をproduct_Aに変更しています。 重複するstore_IDを1つのレコードに置き換える必要があります。両方のコピーが「product_A」と「product_B」です。 store_IDが重複して「product_A」と「product_D」と表示された場合、両方のレコードを表示しますアップ。混乱をおかけして申し訳ありませんが、あなたが助けることを願っていますありがとう! –

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

を...サンプルデータで動作しますその別の汚いトリック;)

0

コメントであなたの要求を修正している答えに。同じ店舗にもproduct_Aがある場合は、product_Bを抑制します。他のすべての行は結果に残ります。少なくともこれは私が今これを理解する方法です。あなたはそれをより読み見つけた場合

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') 
); 
+0

返信いただきありがとうございます!同じstore_IDにもproduct_Aがある場合、product_Bをproduct_Bに置き換え、抑制しないようにしたい。あなたの方法ではproduct_Aで置き換えてカウントの観点からproduct_Bを削除するだけで、カウントは同じままで、今はproduct_Aカテゴリに変更されていると思います。 ストアにはproduct_B OR product_A OR product_Cのみが含まれています。 または、ストアにproduct_Cとproduct_Aの両方がある場合。 または、ストアにproduct_C AND product_Bがある場合。 ストアにproduct_A AND product_Bがある場合、そのときのみproduct_Bがproduct_Aに置き換えられます。 –

+0

クエリはすべてのストアと製品をリストします。カウントはありません。ストアにproduct_Aとproduct_Bの両方がある場合、product_Bは表示されません。それはあなたが探しているものと一致するようです。まだ言及していない唯一の状況は、店舗にproduct_Aとproduct_Bとproduct_Cがある場合です。ストアにはproduct_Aとproduct_Bの両方があるため、product_Aとproduct_Cが表示されます。そのため、product_Aのみが表示されます。これはあなたが望むものと違うのですか?クエリの1つを試しましたか?結果はあなたが探しているものと異なるのですか?もしそうなら、どうですか? –

+0

もう一度、私はそれが「表示されない」ようにしたくありません。代わりに、product_Aの2つのインスタンスを表示したいと思います。したがって、あるストアにproduct_Aとproduct_Bの両方がある場合、product_Bはproduct_Aに変更され、そのストアは1つのproduct_Aと1つのproduct_Bの代わりにproduct_Aの2つのカウントを持つようになります。 –

関連する問題