Думая об этом так, вы пытаетесь связать таблицу с самой собой через 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 не были постоянными.
Edited добавить: Если вы ищете один запрос, а не перебор над ним на любом языке, вы запрашиваете от, вы должны были бы сделать это группировкой дважды:
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
Это не имеет никакого смысла для меня, можете ли вы перефразировать вопрос? –
Правильны ли ваши данные col2 в первом блоке? – northpole
данные примера и желаемые результаты не имеют смысла - 2001 в два раза встречается в col1 в примере, соответствующие значения col2 равны 3001 и 3003, после каждого - никакого отношения вообще с желаемым выходом. –