【发布时间】:2018-05-10 20:07:19
【问题描述】:
我需要在 SQL 中编写一个查询来计算记录的唯一组合的数量。我有一个项目表,每个项目都有一个子表列出选项。每个项目可能有 0 到 x 个选项。我想计算每种组合有多少。我以为我可以使用子表并使用 pivot 和 unpivot 对其进行转置,但我还没有弄清楚。然后我尝试创建一个组合列表,但我不知道如何计算出现次数。有人可以告诉我如何做到这一点或指出正确的方向吗?
这是我要使用的表格:
Item | Option
----------------
1 | A
1 | B
2 | B
3 | B
4 | B
4 | C
5 | A
6 | A
6 | B
6 | C
7 | A
7 | B
7 | C
8 | A
8 | B
9 | A
10 | A
10 | B
我想要的结果是这样的:
Option 1 | Option 2 | Option 3 | Count
--------------------------------------------
A | B | | 3 * 1, 8, 10
B | | | 2 * 2, 3
B | C | | 1 * 4
A | | | 2 * 5, 9
A | B | C | 2 * 6, 7
这就是说 A 和 B 的组合出现了两次,两次 B 是唯一选择的选项,B 和 C 一起选择了 1 次。 (星号后面的数字不是结果的一部分,它们只是用来显示正在计算的项目。)
我最接近的是下面的查询。它给了我独特的组合,但没有告诉我这种组合发生了多少次:
SELECT ItemCombo, Count(*) AS ItemComboCount
FROM
(
SELECT
Item
,STUFF((SELECT ',' + CAST(Option AS varchar(MAX))
FROM itemDetail a
WHERE a.Item = b.Item
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,''
) AS ItemCombo
FROM itemDetail b
) AS Combos
GROUP BY ItemCombo
ORDER BY Count(*) DESC
【问题讨论】:
标签: sql sql-server pivot transpose unpivot