Fórum Limitações de UNION #58091

28/03/2007

0

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):

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

Belo

Responder

Posts

29/03/2007

Sremulador

amigo, só um detalhe referente ao union, se você tiver muitos registro suas pesquisas vão demorar um ceculo


Responder

Gostei + 0

08/04/2007

Rodolpho123

Pelo que eu entendi, isso é uma pesquisa de satisfação, não é? Isso não ficaria melhor com um relacionamento mestre-detalhe? Porém, se isso não for possível, não aconselho a vc executar estas unions no banco, pois conforme nosso amigo emulador já disse, vai levar bastante tempo para retornar o resultado. Tente executar estas operações usando um ClientDataSet. Ele é ótimo para estas situações....


Responder

Gostei + 0

08/04/2007

Belo

Pelo que eu entendi, isso é uma pesquisa de satisfação, não é? Isso não ficaria melhor com um relacionamento mestre-detalhe? Porém, se isso não for possível, não aconselho a vc executar estas unions no banco, pois conforme nosso amigo emulador já disse, vai levar bastante tempo para retornar o resultado. Tente executar estas operações usando um ClientDataSet. Ele é ótimo para estas situações....


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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar