在SQL Server中给定产品中查找共同属性
我正在尝试查找给定产品集合(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,所以我不是很熟悉这些方法,但我认为这个问题将需要一个或两个。 请帮忙!
您可以使用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
感谢您提供合法的答案。 –
您可以结合Top
与count()
来实现它。试试这个
SELECT TOP 1 attribute_id, [value]
FROM yourtable
GROUP BY attribute_id,[value]
ORDER BY Count(*) DESC
我不想将结果集限制为只有一行。我相信这会返回任何最常见的属性,但不一定对所有给定产品都是共同的。 –
为什么向下票呢? –