[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