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
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
Curtir tópico
+ 0
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.
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:
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
Clique aqui para fazer login e interagir na Comunidade :)