Этот запрос для вопроса 2. Он может быть тривиально изменен, чтобы соответствовать результату из вопроса 1.
declare @t table
(
name varchar(50),
gender varchar(50),
answers varchar(50)
)
insert into @t
select 'Tom', 'Male', '1,2,3'
union
select 'Kate', 'Female', '1,4'
union
select 'John', 'Male', '2,4'
union
select 'Maggy', 'Female', '1,3'
select
gender, answer, count = count(*)
from
(
select
gender,
-- here t2.c is an xml column, which holds values of this sort <a>1</a>
-- 'data(.)' gets the value from the <a> tag
answer = cast(t2.c.query('data(.)') as varchar)
from
(
select
name, gender,
-- represent answers in the xml, proper for xquery node function
-- for example <root><a>1</a><a>2</a></root>
answers = cast('<root><a>' + replace(answers, ',', '</a><a>') + '</a></root>' as xml)
from @t
) t1
-- xquery nodes function reads the xml and
-- in this case for each tag <a> it returns a separate row
cross apply answers.nodes('/root/a') t2(c)
) t
group by gender, answer
order by gender desc, answer
Примечание: результат не будет соответствовать тому, который вы указали в части 2, потому что ваш результатне соответствует данным вашего примера, если я правильно понял вашу проблему.