2017-02-13 71 views
-1

下面是我们的CRM中的一个表格的例子,它不是我选择存储这些数据的方式,但是那是由什么来计算每个选项被多少次选择的“好”方法各组?SQL计数值在多个列中出现多少次?

要求在这里,我不顾一切地进入一个令人费解的case语句:)提前

+----------+--------+---------+---------+---------+ 
| PersonID | Team | Option1 | Option2 | Option3 | 
+----------+--------+---------+---------+---------+ 
|  1 | Blue | A  | B  | C  | 
|  2 | Blue | B  | C  | D  | 
|  3 | Blue | D  | A  | E  | 
|  4 | Red | A  | B  | D  | 
|  5 | Red | B  | A  | C  | 
|  6 | Yellow | A  | B  | C  | 
|  7 | Yellow | A  | C  | D  | 
+----------+--------+---------+---------+---------+ 

由于之前

+1

你尝试过什么SQL? –

+0

感谢格式...我在这里是新的,并没有意识到发布这种方式会显示整个代码,而不是只是一张桌子:) – Glyn

回答

2

您可以使用CROSS APPLY和表值构造函数将3个选项列转化为单个列,然后执行计数:

SELECT t.Team, upvt.[Option], COUNT(*) AS Occurances 
FROM dbo.T 
CROSS APPLY (VALUES (t.Option1), (t.Option2), (t.Option3)) AS upvt ([Option]) 
GROUP BY t.Team, upvt.[Option] 
ORDER BY t.Team, upvt.[Option]; 

那么这将给:

Team  Option Occurances 
------------------------------- 
Blue  A   2 
Blue  B   2 
Blue  C   2 
Blue  D   2 
Blue  E   1 
Red   A   2 
Red   B   2 
Red   C   1 
Red   D   1 
Yellow  A   2 
Yellow  B   1 
Yellow  C   2 
Yellow  D   1 
+0

看起来很完美,将尝试,谢谢..看起来像很多选项包含NULL,所以将只需要在那里考虑 – Glyn

0

您可以使用UNION ALL的值移到一列,然后做汇总:

select 
    team, option, count(*) cnt 
from(
    select team, option1 option from t union all 
    select team, option2 from t union all 
    select team, option3 from t 
)t group by team, option; 
相关问题