SQL SERVER contando campos

16/02/2016

0

Boa tarde Galera.
Sou iniciante em banco de dados SQL domino os comandos básicos. Estou com o seguinte problema.
Tenho as tabelas: SZATENDIMENTO, SZPARCIALATEND, SZATENDHONORARIO, SZPACIENTE, SZCADGERAL.
Dessas tabelas SZPARCIALATEND E SZATENDIMENTO são utilizadas apenas para fazer a ligação com as outras tabelas.
Os campos utilizados na consulta são SZATENDHONORARIO.DISCRIMINACAO ‘Procedimento’, SZPACIENTE ‘Paciente’, SZCADGERAL ‘Convenio’.
O campo SZPACIENTE ‘Paciente’ é necessário pois somente através dele consigo filtrar resultados iguais pelo SELECT DISTINCT.
O que acontece é que sem o campo SZPACIENTE ‘Paciente’ eu consigo usar a clausula GROUP BY e contar normalmente a quantidade de procedimentos por convenio. No entanto a consulta fica incorreta. Porem se eu usar o campo SZPACIENTE ‘Paciente’ o resultados ficam corretos no entanto eu não consigo utilizar a clausula GROUP BY.
Segue consulta abaixo
SELECT DISTINCT SZCADGERAL.SIGLA'Convenio', SZATENDHONORARIO.DISCRIMINACAOHM 'Procedimento', SZPACIENTE.NOMEPACIENTE 'Paciente'
FROM SZATENDIMENTO, SZPARCIALATEND, SZATENDHONORARIO, SZPACIENTE, SZCADGERAL

WHERE SZATENDIMENTO.NUMEROCONTA = SZPARCIALATEND.NUMEROCONTA
AND SZATENDIMENTO.SEQUENCIALCONTA = SZPARCIALATEND.SEQUENCIALCONTA

AND SZPARCIALATEND.NUMEROCONTA = SZATENDHONORARIO.NUMEROCONTA
AND SZPARCIALATEND.SEQUENCIALCONTA = SZATENDHONORARIO.SEQUENCIALCONTA

AND SZATENDIMENTO.CODPACIENTE = SZPACIENTE.CODPACIENTE
AND SZATENDIMENTO.CODCOLIGADA = SZPACIENTE.CODCOLIGADA

AND SZATENDIMENTO.CODCOLIGADA = SZCADGERAL.CODCOLIGADA
AND SZATENDIMENTO.CODCOMPRADOR = SZCADGERAL.CODGERAL

AND SZATENDHONORARIO.ESTORNADO IS NULL
AND SZATENDHONORARIO.DISCRIMINACAOHM LIKE '%tonometria%'
AND SZATENDHONORARIO.DATAREALIZACAOHM BETWEEN '2015-01-01' AND '2015-12-31'

ORDER BY SZCADGERAL.SIGLA
Se alguem souber uma forma melhor de montar uma consulta dessa, gostaria muito de saber, pois realmente estou gostando muito de aprender sobre SQL.
Libio Souza

Libio Souza

Responder

Post mais votado

16/02/2016

Bom ta meio confuso, você quer contar mas sua query tem um DISTINCT?

Indo para ajuda sobre montar query, procure usar uma indentação (formatação do seu código) fica mais légivel;
Se tiver usando tabelas em modo de produção (fazendo consulta onde o sistema usa para gravar os registros) é bom utilizar WITH(NOLOCK) para não alocar a tabela e atrapalhar o sistema

Claudio Lopes

Claudio Lopes
Responder

Mais Posts

16/02/2016

Libio Souza

Vou tentar ser mais claro.
Eu preciso montar uma consulta SQL que me informe o número de procedimentos por convênios usando esses três campos CONVENIO, PROCEDIMENTO, PACIENTE
O campo PACIENTE é necessário para o SELECT DISTINCT filtrar os dados corretamente para mim pois sem ele os dados duplicam ou triplicam.
Em relação ao comando que você falou WITH(NOLOCK) vou pesquisar e aprender a usá-lo pois não sabia que fazendo consultas também impactaria na base de produção.
Responder

16/02/2016

Claudio Lopes

Libio, o que faz o paciente ficar duplicado? Geralmente isso acontece por algum relacionamento que está usando....
Eu gosto muito de usar o padrão convecional

Select 
* 
from 
tabela1 left join tabela2 on tabela1.id_campo = tabela2.idcampo


Dessa forma fica mais claro quais são suas ligações e caso vc tenha mais de um join, consegue ir depurando (comentando com "---" ) cada linha do join e encontrar onde duplica.


Existe outra forma tambem de se fazer... imagine que o seu resultado traga PACIENTE, CONVENIO E PROCEDIMENTO, sem repetir o paciente. Você pode jogar esse resultado em uma tabela temporaria e depois realizar o seu count

Exemplo:
SELECT 
	DISTINCT 
    SZCADGERAL.SIGLA'Convenio', 
    SZATENDHONORARIO.DISCRIMINACAOHM 'Procedimento', 
    SZPACIENTE.NOMEPACIENTE 'Paciente'
    INTO #TBL_TMP --- GRAVA NA TEMPORARIA
FROM 
	SZATENDIMENTO WITH(NOLOCK), SZPARCIALATEND WITH(NOLOCK), SZATENDHONORARIO WITH(NOLOCK), SZPACIENTE WITH(NOLOCK), SZCADGERAL WITH(NOLOCK)
WHERE 
	SZATENDIMENTO.NUMEROCONTA = SZPARCIALATEND.NUMEROCONTA
	AND SZATENDIMENTO.SEQUENCIALCONTA = SZPARCIALATEND.SEQUENCIALCONTA

	AND SZPARCIALATEND.NUMEROCONTA = SZATENDHONORARIO.NUMEROCONTA
	AND SZPARCIALATEND.SEQUENCIALCONTA = SZATENDHONORARIO.SEQUENCIALCONTA

	AND SZATENDIMENTO.CODPACIENTE = SZPACIENTE.CODPACIENTE
	AND SZATENDIMENTO.CODCOLIGADA = SZPACIENTE.CODCOLIGADA

	AND SZATENDIMENTO.CODCOLIGADA = SZCADGERAL.CODCOLIGADA
	AND SZATENDIMENTO.CODCOMPRADOR = SZCADGERAL.CODGERAL

	AND SZATENDHONORARIO.ESTORNADO IS NULL
	AND SZATENDHONORARIO.DISCRIMINACAOHM LIKE '%tonometria%' -- LIKE NÃO É PERFORMATICO, NÃO POSSUI ID'S QUE POSSA UTILIZAR??
	AND SZATENDHONORARIO.DATAREALIZACAOHM BETWEEN '2015-01-01' AND '2015-12-31'

ORDER BY 
	SZCADGERAL.SIGLA
    
SELECT
	PACIENTE,
    CONVENIO,
    PROCEDIMENTO,
    COUNT(0) AS TOTAL
FROM
	#TBL_TMP
GROUP BY
	PACIENTE,
    CONVENIO,
    PROCEDIMENTO

DROP TABLE #TBL_TMP --APAGA A TABELA TEMPORARIA
Responder

17/02/2016

Libio Souza

Realmente como você falou Din tem algum problema nas ligações que estou fazendo. No momento que eu ligo as tabelas SZPARCIAL e SZHONORARIO ocorre a duplicação ou triplicação de alguns pacientes.
Em relação ao padrão convencional (INNER JOINA). Começei a usalo, pesquisei e aprende a usar os comandos Inner join, left, right e full. Deixa muito mais organizado e fácil de entender além de poder setar apelidos as tabelas com o comando AS.
Mesmo utilizando os JOINS não consegue ainda encontrar o porquê minhas consultas estão duplicando. Então Fiz da forma que você falou criando uma tabela temporária. Deu muito certo xD.
Minha única dúvida restante é porque os meus joins não está dando certo. Aparentemente as ligações estão corretas.
Em relação ao LIKE que você falou. O que acontece é que o banco de dados está todo atrapalhado, os dados não têm padrão ou organização. Eu poderia montar essa consulta pelo código do procedimento porem estão todos fora de ordem e nem o pessoal que criou sabe os códigos. Então perderia semanas descobrindo os códigos. Para resolver o agora foi a forma que eu encontrei de montar o relatório pesquisando pelo nome.
Din O que você me mostrou já me ajudou demais tanto no problema como em conhecimento.
Vlw cara.
Responder

17/02/2016

Isaac Jose

Boa tarde a todos.

você deve conseguir fazer esse trabalho utilizando sub selects com os agrupamentos para tirar as duplicidades.

poste o código fictício das suas tabelas com alguns inserts que tento montar pra vc

segue abaixo um exemplo onde tenho distinct , count, group by , inner e left tudo junto ..
SELECT 
E.CAMPOS
FROM 
(
	SELECT DISTINCT 
	D.,COUNT(D.)
	FROM 
(
		SELECT distinct 
		INNER JOIN  C ON
						  A.IDFUNCAO = C.idFuncao 
		LEFT JOIN B 
		ON B. = A. 
		WHERE C. IN (1,2,3) 
		GROUP BY ) D
		GROUP BY ) D ON
C. = D. AND
C. = D.
) AS E
Responder

17/02/2016

Claudio Lopes

Que bom cara. Precisando estamos por ai
Responder

19/02/2016

Helder

Olá pessoal, tudo bem?
Não sei se já conhecem, mas existe uma plataforma para criação de webservices muito eficiente, basta apenas liberar acesso para o banco de dados, e você pode criar uma nova tabela, um novo campo com apenas um clique, talvez ajude muito vocês.
Fica a indicação do Datasocket.
datasocket.co/free
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