2017-02-13 7 views
-1

Ниже приведен пример таблицы в нашем CRM, это не тот способ, который я бы выбрал для хранения этих данных, но that by by by. Что было бы «хорошим» способом подсчета количества раз, когда каждый параметр был выбран каждая команда?SQL подсчитывает, сколько раз значение появляется в нескольких столбцах?

спрашивать здесь, прежде чем я пойти с головой в свернутой сазе :)

+----------+--------+---------+---------+---------+ 
| 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

Вы можете UNPIVOT ваших 3 опционных колонок в одну колонку с помощью CROSS APPLY и конструктора таблицы значений, а затем выполнить ваш подсчет:

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;