resumo de inquérito

Boas
Pretendo fazer uma consulta resumo de um formulário de questionário mas não estou conseguindo.
Então é assim:

formulário questionário:

ano: 2013
preço do evento (radio button): mau - médio - bom - excelente
data do evento (radio button): mau - médio - bom - excelente
local do evento (radio button): mau - médio - bom - excelente

base de dados com registos:

ano preco data local
2013 bom mau bom
2013 médio mau excelente
2013 bom médio bom
2013 mau bom médio

E agora pretendo fazer uma consulta resumo das votações da seguinte forma:

          mau        médio        bom       excelente

preco 1 1 2 -
data 2 1 1 -
local - 1 2 1

E queria também disponibilizar a opção de ordenação pela coluna clicada: Clicando em ‘médio’ ordenava as linhas pela coluna ‘médio’.
No exemplo mostrado, clicando na coluna ‘excelente’, a primeira passaria a ser ‘local’ (a que tem maior votação)

É possível? Alguém sabe?

Já consegui

SELECT ‘preco’ AS item,
COUNT( case preco when ‘excelente’ then 1 else null end ) AS excelente,
COUNT( case preco when ‘bom’ then 1 else null end ) AS bom,
COUNT( case preco when ‘médio’ then 1 else null end ) AS medio,
COUNT( case preco when ‘mau’ then 1 else null end ) AS mau,
COUNT( case preco when ‘sem opinião’ then 1 else null end ) AS semopiniao,
COUNT( case preco when ‘sem resposta’ then 1 else null end ) AS semresposta
FROM questionario
GROUP BY item

union all

SELECT ‘data’ AS item,
COUNT( case data when ‘excelente’ then 1 else null end ) AS excelente,
COUNT( case data when ‘bom’ then 1 else null end ) AS bom,
COUNT( case data when ‘médio’ then 1 else null end ) AS medio,
COUNT( case data when ‘mau’ then 1 else null end ) AS mau,
COUNT( case data when ‘sem opinião’ then 1 else null end ) AS semopiniao,
COUNT( case data when ‘sem resposta’ then 1 else null end ) AS semresposta
FROM questionario
GROUP BY item

union all

SELECT ‘local’ AS item,
COUNT( case local when ‘excelente’ then 1 else null end ) AS excelente,
COUNT( case local when ‘bom’ then 1 else null end ) AS bom,
COUNT( case local when ‘médio’ then 1 else null end ) AS medio,
COUNT( case local when ‘mau’ then 1 else null end ) AS mau,
COUNT( case local when ‘sem opinião’ then 1 else null end ) AS semopiniao,
COUNT( case local when ‘sem resposta’ then 1 else null end ) AS semresposta
FROM questionario
GROUP BY item

Um abraço