我正在尝试查找给定产品组(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,所以我不熟悉这些方法,但我认为这个问题需要一个或两个。 请帮忙!
答案 0 :(得分:0)
您可以将Top
与count()
合并来实现它。试试这个
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