Melhor prática para SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pessoal, estou precisando fazer uma consulta que faça um count em uma tabela, porém acredito que a maneira como estou fazendo não é a recomendada.
Como será uma consulta para um relatório, será executada várias vezes ao dia e queria ver uma forma de melhorar sua performance.

O caso é assim:
Tenho aqui uma relação de prestadores(médicos) que são credenciados à nossa rede. Esses dados ficam numa tabela chamada prestador.

Os campos "que interessam" nessa tabela são o Id_prestador, nome_prestador e tipo_prestador.

Em uma outra tabela, chamada especialidade_prestador existem os campos cd_especialidade e cd_prestador, onde é feita a associação entre os prestadores e suas especialidades.

E por fim, a tabela especialidade, que contém o cd_especialidade e ds_especialidade, que é a descrição da especialidade (clínico geral, pediatra, cardiologista, etc.)

O que eu quero é criar uma query que exiba os dados assim:

Selecionar tudo

CD_ESPECIALIDADE        DS_ESPECIALIDADE       CNT_TIPO1          CNT_TIPO2
=============================================================================================

Explicando: A query irá listar todas as especialidades e em cnt_tipo1 é o número de prestadores da especialidade listada onde o campo tipo_prestador da tabela prestador for 1. Já na coluna cnt_tipo2 exibirão a quantidade de prestadores da especialidade cujo tipo é 2.

O que estou fazendo é montar o select com apenas o cnt_tipo1 e para o cnt_tipo2 estou fazendo outro select.

Selecionar tudo

SELECT e.cd_especialidade, e.ds_especialidade, Count(p.cd_prestador) cnt_tipo1,
(select count(*) from ....) cnt_tipo2
from ....
Como posso fazer dois Counts diferentes na mesma query?

Acredito que essa seja a melhor forma.

Obrigado.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

jks1903,

Talvez você possa fazer um SELECT com CASE para obter a informação que precisa. Ajudaria se você informasse a estrutura das tabelas envolvidas.

Abraços,

Sergio
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Com um CASE?
Já vi alguns exemplos utilizando o mesmo, mas nunca cheguei a utilizar de fato, rsrs.

Você poderia me mostrar mais ou menos como seria?

Segue estrutura das tabels envolvidas com os campos utilizados:

Selecionar tudo

PRESTADOR /*tabela de prestadores */
==========
cd_prestador
nm_prestador
tp_status /*ESSE STATUS PODE SER 'I' OU 'A', SIGNIFICANDO ativo ou inativo*/
tipo_prestador /*Esse é o campo onde testo se o tipo é 1 ou 2



ESPECIALIDADE_PRESTADOR /*essa tabela relaciona as especialidades com os prestadores
===================
cd_prestador
cd_especialidade


ESPECIALIDADES /*nessa tabela são armazenadas as especialidades*/
=============
cd_especialidade
ds_especialidade

E agora a necessidade, de exibir os dados assim:

Selecionar tudo

cd_especialidade    ds_especialidade  cnt_tipo1    cnt_tipo2
cnt_tipo1 e cnt_tipo2 acima são as colunas onde será exibidas as quantidades de prestadores de cada especialidade, separando pelo tipo de prestador 1 ou 2.

Obrigado.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

jks1903,

Creio que você encontraria outros tópicos no forum sobre SELECT CASE, mas
tente arriscar a querie abaixo:

Selecionar tudo

select C.CD_ESPECIALIDADE,
       C.DS_ESPECIALIDADE,
       sun(case when (A.TIPO_PRESTADOR=1) then 1 else 0 end) as CNT_TIPO1, 
       sum(case when (A.TIPO_PRESTADOR=2) then 1 else 0 end) as CNT_TIPO2
  from (select CD_PRESTADOR,TIPO_PRESTADOR from PRESTADOR) A,
       (select CD_PRESTADOR,CD_ESPECIALIDADE from ESPECIALIDADE_PRESTADOR) B,
       (select CD_ESPECIALIDADE,DS_ESPECIALIDADE from ESPECIALIDADES) C
 where C.CD_ESPECIALIDADE = B.CD_ESPECIALIDADE
   and B.CD_PRESTADOR = A.CD_PRESTADOR
 group by C.CD_ESPECIALIDADE,
          C.DS_ESPECIALIDADE
 order by C.CD_ESPECIALIDADE;

Abraços e boa sorte,

Sergio
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Cara, isso ai, bem como eu queria.
Apenas uma dúvida.
Ali no from, para referenciar as tabelas você fez isso:

Selecionar tudo

 (select CD_PRESTADOR,CD_TIP_PRESTADOR from PRESTADOR) A
Algum motivo especial para isso?
Eu fiz um teste informando simplesmente a tabela PRESTADOR e obtive os mesmos resultados.

vlw.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Oi,

É somente um método eu que costumo usar ao desenvolver algumas queries.

Para mim, fica mais facil identificar a informacao coletada de cada tabela.

você pode simplificar esta querie, exatamente da forma como você descreveu.

Abraços,

Sergio
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Certo, entendi.

Mas blza, vlw mesmo.

Abraço.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 24 visitantes