Ajuda com select count

13/07/2023

0

Bom dia. Estou criando um relatório em um sistema de gestão hospitalar, ao qual deve trazer cinco colunas.
O número de atendimentos, a data de entrada do paciente no hospital, o código do medico que o atendeu , o nome do médico e o convênio.
Até ai tranquilo, porém estou com dificuldade para colocar um contador da coluna nr. atendimento; Lembrando que as colunas acima pertencem a tabelas diferentes, sendo necessária referencia-las..
Segue o código abaixo sem o count.

SELECT g.NR_ATENDIMENTO, g.DT_ENTRADA, g.CD_MEDICO_ATENDIMENTO, h.NM_PESSOA_FISICA, k.DS_CONVENIO
from atendimento_paciente g,
Pessoa_Fisica H,
Atend_Categoria_Convenio J,
Convenio K
Where Dt_Entrada Between '01/01/2023' And '01/02/2023'
And H.Cd_Pessoa_Fisica = G.Cd_Medico_Atendimento
And g.nr_atendimento = j.nr_atendimento
And J.Cd_Convenio = K.Cd_Convenio

Como preciso informar também também o total de atendimento, precisaria por um select count dos nr_atendimento, porém sempre que coloco , dá erro.

Tento colocar dessa forma, e o mesmo apresenta o seguinte erro:

ORA-00937: não é uma função de grupo de grupo simples
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
Erro na linha: 1 Coluna: 8


SELECT g.NR_ATENDIMENTO, count (g.nr_atendimento),g.DT_ENTRADA, g.CD_MEDICO_ATENDIMENTO, h.NM_PESSOA_FISICA, k.DS_CONVENIO
from atendimento_paciente g,
Pessoa_Fisica H,
Atend_Categoria_Convenio J,
Convenio K
Where Dt_Entrada Between '01/01/2023' And '01/02/2023'
And H.Cd_Pessoa_Fisica = G.Cd_Medico_Atendimento
And g.nr_atendimento = j.nr_atendimento
And J.Cd_Convenio = K.Cd_Convenio
Lucas

Lucas

Responder

Posts

13/07/2023

Arthur Heinrich

A sua query, aparentemente, não faz sentido.

Supondo que a coluna NR_ATENDIMENTO seja o número de identificação de um atendimento, uma PK na tabela "atendimento_paciente", você não poderá agrupar os registros, pois cada linha será diferente.

Sempre que você adiciona uma função de agregação, como sum(), min(), max(), avg(), count(), etc., você precisa especificar de que forma os dados devem ser agrupados.

De uma maneira geral, todas as colunas que não utilizam função de agregação tem que ser agregadoras e aparecer no cláusula "group by"

SELECT g.NR_ATENDIMENTO, count (g.nr_atendimento),g.DT_ENTRADA, g.CD_MEDICO_ATENDIMENTO, h.NM_PESSOA_FISICA, k.DS_CONVENIO
from atendimento_paciente g,
Pessoa_Fisica H,
Atend_Categoria_Convenio J,
Convenio K
Where Dt_Entrada Between '01/01/2023' And '01/02/2023'
And H.Cd_Pessoa_Fisica = G.Cd_Medico_Atendimento
And g.nr_atendimento = j.nr_atendimento
And J.Cd_Convenio = K.Cd_Convenio
group by g.NR_ATENDIMENTO, g.DT_ENTRADA, g.CD_MEDICO_ATENDIMENTO, h.NM_PESSOA_FISICA, k.DS_CONVENIO

Mas, como eu disse, é provável que apareça tudo como 1 na contagem.

Existe uma forma de utilizar funções analíticas. Neste caso, o count() ou qualquer função agregadora se torna independente do resultado, não requerendo o group by final. Mas a informação do agrupamento precisa ser especificada de forma diferente:

SELECT
g.NR_ATENDIMENTO,
count (g.nr_atendimento) over(partition by g.CD_MEDICO_ATENDIMENTO) tot_atend_do_medico,
count (g.nr_atendimento) over(partition by h.NM_PESSOA_FISICA, k.DS_CONVENIO) tot_atend_cliente_neste_conv,
g.DT_ENTRADA, g.CD_MEDICO_ATENDIMENTO, h.NM_PESSOA_FISICA, k.DS_CONVENIO
from atendimento_paciente g,
Pessoa_Fisica H,
Atend_Categoria_Convenio J,
Convenio K
Where Dt_Entrada Between '01/01/2023' And '01/02/2023'
And H.Cd_Pessoa_Fisica = G.Cd_Medico_Atendimento
And g.nr_atendimento = j.nr_atendimento
And J.Cd_Convenio = K.Cd_Convenio

Neste caso, cada expressão pode indicar um agrupamento distinto, somando dados de todas as linhas retornadas que compartilhem o mesmo valor nas colunas do particionamento.
Responder

13/07/2023

Frank Hosaka

Eu faria assim
tbatendimento(id,data,idmedico,idpaciente,idconvenio)(1,'2023-07-13',1,1)(2,'2023-07-13',2,2)
tbmedico(id,nome)(1,'Dr House')(2,'Dr Kildare')
tbpaciente(id,nome)(1,"Frank")(2,"João")
tbconvenio(id,nome)(1,"Amil"),(2,"Santa Helena")
Todos os id de todas as tabelas defini como auto incremento.

Para fazer o relatório do dia '2023-07-13', eu usaria essa consulta:
select tbatendimento.id, tbatendimento.data, tbmedico.nome,tbpaciente.nome,tbconvenio.nome from tbatendimento 
join tbmedico on tbatendimento.idmedico=tbmedico.id
join tbpaciente on tbatendimento.idpaciente=tbpaciente.id
join tbconvenio on tbatendimento.idconvenio=tbconvenio.id
where data='2023-07-13'
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar