[firebase-br] UNION - Limitações

Eduardo Belo belo em elogica.com.br
Qui Abr 5 12:59:27 -03 2007


Prezados,

Tem uma tabela com 52 campos, todos do tipo Integer, onde o valores
digitados são de 1 a 4, que corresponde aos itens:

1 = OTIMO
2 = BOM
3 = REGULAR
4 = RUIM

Onde o resultado é o percentual de cada um em relação a quantidade,
exemplo(Simplificado):

ID ITEM DESCRICAO QTD OTIMO BOM REG RUIM
39 3 Pontualidade no Atendimento 214 23,36 23,83 39,72 13,08
40 3 Receptividade do Profissional 210 32,86 33,33 30,48 3,33
41 3 Satisfação com o Resultado 208 37,02 35,58 25,00 2,40

Para gerar essa consulta eu criei uma view, tipo:

SELECT 39 AS ID, 3 AS ITEM, 'Pontualidade no Atendimento' AS DESCRICAO,
COALESCE(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0) AS QTD,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.PONTUALIDADEATENDIMENTO=1)/NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0)
AS OTIMO,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.PONTUALIDADEATENDIMENTO=2)/NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0)
AS BOM,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.PONTUALIDADEATENDIMENTO=3)/NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0)
AS REGULAR,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.PONTUALIDADEATENDIMENTO=4)/NULLIF(COUNT(AMBULATORIO.PONTUALIDADEATENDIMENTO),0)
AS RUIM
FROM AMBULATORIO UNION

SELECT 40 AS ID, 3 AS ITEM, 'Receptividade do Profissional' AS DESCRICAO,
COALESCE(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0) AS QTD,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.RECEPTIVIDADEPROFISSIONAL=1)/NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0)
AS OTIMO,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.RECEPTIVIDADEPROFISSIONAL=2)/NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0)
AS BOM,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.RECEPTIVIDADEPROFISSIONAL=3)/NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0)
AS REGULAR,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.RECEPTIVIDADEPROFISSIONAL=4)/NULLIF(COUNT(AMBULATORIO.RECEPTIVIDADEPROFISSIONAL),0)
AS RUIM
FROM AMBULATORIO UNION

SELECT 41 AS ID, 3 AS ITEM, 'Satisfação com o Resultado do Tratamento
Médico' AS DESCRICAO,
COALESCE(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0) AS QTD,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.SATISFACAOTRATAMENTOMEDICO=1)/NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0)
AS OTIMO,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.SATISFACAOTRATAMENTOMEDICO=2)/NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0)
AS BOM,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.SATISFACAOTRATAMENTOMEDICO=3)/NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0)
AS REGULAR,
100*(SELECT CAST(NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0) AS
DOUBLE PRECISION) FROM AMBULATORIO WHERE
AMBULATORIO.SATISFACAOTRATAMENTOMEDICO=4)/NULLIF(COUNT(AMBULATORIO.SATISFACAOTRATAMENTOMEDICO),0)
AS RUIM
FROM AMBULATORIO UNION ...

O problema é que o Firebird tem limitações de UNION, quando faço mais de 20
se não me engano, dá o erro:
Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255

A minha solução foi dividir essa quantidade, e gerei 5 View´s, uma vez que
são 52 campos na tabela, e seria no caso 52 UNION´s.

O problema é que eu preciso gerar essa consulta em um unico resultado, e não
tem como unir essas views.

existe alguma forma de gerar uma Store Procedure para unir tudo isso?

Ou alguma outra sugestão?

Agradeço a todos que ajudarem.

Estou usando a versão 2.0.1 do Firebird.


Mais detalhes sobre a lista de discussão lista