2017-05-18 100 views
0

を持つ列。私は記事のすべての情報を持つテーブルを持っています。私はそれと同じ列を自分と比較したいと思います。私は複数のタイプの記事を持っているからです。単一の製品とマスター製品。私がそれを変えなければならない唯一の方法は、SKUによるものです。例えば。SQLを検証し、私は次のような状況があり、同じ列

ID | SKU 
1 | 11111 
2 | 11112 
3 | 11113 
4 | 11113-5 
5 | 11113-8 
6 | 11114 
7 | 11115 
8 | 11115-1-W 
9 | 11115-2 
10 | 11116 

私は、一意の完全であるskuのみをリストにしたいと思っています。ユニークでないと何のバリアントを持っているSKUに例目従う私は11113は、列に再びある場合は、それをCOUTないクエリを作成することになるでしょう(ID = 1、2、6、10)です。だから合計で私は4つのユニークなスキューではなく、 "6(合計)"となります。私にお知らせください。これが可能ならば。

+0

質問を編集して、希望の出力がどのように表示されるかの表を含めてください。 – KindaTechy

+0

「マスター」SKUの長さは常に正確に5文字ですか? – Bohemian

答えて

0

あなたは一意の行をグループ化し、カウントすることによってこれを行うことができます。

まず、私たちはあなたのテーブルを取ると、MasterSKUを新しい列を追加する必要があります。これはSKU列の最初の5文字になります。我々はMasterSKUを持っていたら、私たちはGROUP BY、それをすることができます。これにより、同じMasterSKUのすべての行がまとめられます。グループ化すると、COUNT()などの集計関数にアクセスできます。この関数を使用して、それぞれMasterSKUの行数をカウントします。次に、COUNT()が1を超える行を除外します。これにより、一意の行だけが残ります。

はIDをつかむためにあなたの元のテーブルに戻ってそれをその独特のリストを取り、 LEFT JOIN

enter image description here

SELECT ID, A.MasterSKU 
FROM (
    SELECT 
     MasterSKU = SUBSTRING(SKU,1,5), 
     MasterSKUCount = COUNT(*) 
    FROM MyTable 
    GROUP BY SUBSTRING(SKU,1,5) 
    HAVING COUNT(*) = 1 
) AS A 
LEFT JOIN (
    SELECT 
     ID, 
     MasterSKU = SUBSTRING(SKU,1,5) 
    FROM MyTable 
) AS B 
ON A.MasterSKU = B.MasterSKU 

は今、一つのこと、私はあなたの例から気づきました。元のSKU列は実際には3つの列のように見えます。私たちは複数の値をhypensと結合しています。

11115-1-W

は、その理由があるかもしれませんが、最も可能性が高いこれはfirst normal formに違反して照会するデータベースが困難になります。このような複雑なクエリが必要な理由の一部です。 SKUの列が実際に複数のものを表している場合、MasterSKU、Version、およびColor、または各ハイフンが表すものに分解することを検討することをお勧めします。マスターのSKUの長さを想定し

1

が5つの文字で、この試してみてください。

select a.* 
from mytable a 
left join mytable b on b.sku like concat(a.sku, '%') 
where length(a.sku) = 5 
and b.sku is null 

をこのクエリは、子のものにマスターのSKUに参加したが、成功したフィルタリングする加入 - だけ孤独マスターのSKUを残します。

+0

私の答えと比較して、長さをフィルタリングすると、はるかにクリーンなクエリになります。ニース。 –

関連する問題