2017-09-14 30 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,因为某些属性是日期或位。如您所见,任何产品都可以具有任何属性组合以及同一类型的多个属性。对于上面的示例设置所需的结果将是一个只有一行,因为这些产品只能有一个共同的属性(通常会有一些共同的):

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

我并不需要返回STOCK_ID号在这个查询中,因为我们从名为#TempItemNumbers的临时表中开始处理这些信息。我只需要返回一组Attribute_ID和值,这些属性ID和值对于通过用户输入生成的#TempItemNumbers中列出的所有Stock_ID号码是通用的。 我通常不使用游标或动态SQL,所以我不是很熟悉这些方法,但我认为这个问题将需要一个或两个。 请帮忙!

+0

为什么向下票呢? –

回答

0

您可以使用ROW_NUMBER()来标记每值的每个属性,那么只选择那些被标记为所有STOCK_ID

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

我不想将结果集限制为只有一行。我相信这会返回任何最常见的属性,但不一定对所有给定产品都是共同的。 –

相关问题