2017-02-13 99 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;