Fórum Limitações de UNION #58091
28/03/2007
0
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):
IDITEMDESCRICAO QTD OTIMO BOM REG RUIM
393Pontualidade no Atendimento21423,3623,8339,7213,08
403Receptividade do Profissional21032,8633,3330,483,33
413Satisfação com o Resultado20837,0235,5825,002,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.
Belo
Curtir tópico
+ 0Posts
29/03/2007
Sremulador
Gostei + 0
08/04/2007
Rodolpho123
Gostei + 0
08/04/2007
Belo
Sim Rodolfo, é uma pesquisa de satisifação. Do jeito que foi elaborado a base, não dá pra fazer mestre-detalhe. Na aplicação já fiz com o ClientDataSet e está rodando, mas o eu gostaria de achar uma solução na própria base, pois no futuro próximo irei migrar para Internet. De qualquer forma obrigado pela dica.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)