在SQL Server

时间:2017-09-14 19:19:17

标签: sql sql-server sql-server-2008-r2

我正在尝试查找给定产品组(Stock_ID号)共有的所有属性。我有一个名为Stock_Attributes的表,其中包含产品信息。它看起来像这样:

+----------+--------------+------------+
| 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,因为某些属性是Dates或Bits。如您所见,任何产品都可以具有任何属性组合和多个相同类型的属性。上述样本集的期望结果只有一行,因为这些产品只有一个共同的属性(通常会有几个共同点):

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

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

2 个答案:

答案 0 :(得分:0)

您可以将Topcount()合并来实现它。试试这个

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

答案 1 :(得分: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