2017-09-14 12 views
-1

特定の製品セット(Stock_ID番号)に共通するすべての属性を検索しようとしています。商品情報を含むStock_Attributesというテーブルがあります。これは次のようになります。SQL Serverの特定の製品間で共通の属性を見つける

+----------+--------------+------------+ 
| Stock_ID | Attribute_ID | Value  | 
+----------+--------------+------------+ 
|  1001 |   2 | Farmhouse | 
|  1001 |   8 | Blue  | 
|  1001 |   9 | Bronze  | 
|  1001 |   10 | Metal  | 
|  1001 |   10 | Wood  | 
|  1002 |   2 | Industrial | 
|  1002 |   9 | Chrome  | 
|  1002 |   10 | Metal  | 
|  1003 |   2 | Industrial | 
|  1003 |   8 | Red  | 
|  1003 |   10 | Glass  | 
|  1003 |   10 | Metal  | 
+----------+--------------+------------+ 

Stock_IDとAttribute_IDのデータ型はどちらもINTです。いくつかの属性は日付またはビットなので、値はsql_variantです。表示されているように、どの製品でも、同じタイプの複数の属性と複数の属性を組み合わせることができます。これらの製品は、唯一の共通の属性を持っているので、上記のサンプルセットに対する所望の結果は、ちょうど1行1になります(一般的に共通のいくつかのがあるでしょう):

+--------------+------------+ 
| Attribute_ID | Value  | 
+--------------+------------+ 
|   10 | Metal  | 
+--------------+------------+ 

私はStock_ID番号を返却する必要はありません。このクエリでは、#TempItemNumbersという一時テーブル内の情報から開始しているためです。 #TempItemNumbersにリストされているすべてのStock_ID番号に共通のAttribute_IDとValueのセットを返すだけで済みます。これはユーザー入力によって生成されます。 私はこれらのメソッドに慣れていないので、通常はカーソルや動的SQLを使用しませんが、この問題にはどちらかまたは両方が必要と考えています。 助けてください!

+0

stock_idしてみてくださいなぜダウン投票? –

答えて

0

それからのみすべてのためにタグ付けされたものを選択ROW_NUMBER()が値ごとに各属性をタグ付けするために使用することができます

SELECT attribute_id, 
     "value" 
    FROM (SELECT *, 
       (SELECT COUNT(DISTINCT stock_id) 
        FROM stock_attributes) cnt, 
       ROW_NUMBER() OVER (PARTITION BY "value", 
               attribute_id 
             ORDER BY stock_id) rnum 
      FROM stock_attributes 
     ) a 
WHERE cnt = rnum 

結果

attribute_id value 
10    Metal 
+0

正当な回答をいただきありがとうございます。 –

0

Topcount()を組み合わせて使用​​できます。これは

SELECT TOP 1 attribute_id, [value] 
FROM yourtable 
GROUP BY attribute_id,[value] 
ORDER BY Count(*) DESC 
+0

結果セットを1行に制限したくありません。私はこれがどんな属性でも共通しているが、すべての与えられた製品に必ずしも共通ではないものを返すと信じている。 –

関連する問題