Думая об этом таким образом, вы пытаетесь связать таблицу с самим собой через col2, поэтому мы начнем с соединения с самим собой:
select left.col1, right.col1/*, ...*/ from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' /* ... */
Теперь для вашей совокупности. Вы хотите объединить все right.col1, чтобы получить счет для этого столбца:
select left.col1, right.col1, COUNT(*) from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' group by right.col2
То, что я считаю, должно выйти с необработанными подсчетами. Я полагаю, вам придется прокрутить запрос и получить общее количество, чтобы получить частоту.
Как примечание, это было бы намного сложнее, если бы col1 не был постоянным.
Отредактировано для добавления : Если вы ищете один запрос, вместо того, чтобы повторять его на любом языке, с которого вы запрашиваете, вам потребуется выполнить эту группировку дважды:
SELECT abs_freq.col1, abs_freq.col2, abs_freq.freq / totals.total
FROM (SELECT
left.col1 AS col1,
COUNT(*) AS total
FROM TABLE LEFT
INNER JOIN TABLE RIGHT
ON left.col2 = right.col2
WHERE left.col1 = '2001'
GROUP BY left.col1
) totals
INNER JOIN (SELECT
left.col1 AS col1,
right.col1 AS col2,
COUNT(*) AS freq
FROM TABLE LEFT
INNER JOIN TABLE RIGHT
ON left.col2 = right.col2
WHERE left.col1 = '2001'
GROUP BY right.col2
) abs_freq
ON abs_freq.col1 = totals.col1