SQL SERVER contando campos
16/02/2016
0
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
Post mais votado
16/02/2016
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
Mais Posts
16/02/2016
Libio Souza
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.
16/02/2016
Claudio Lopes
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
17/02/2016
Libio Souza
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.
17/02/2016
Isaac Jose
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
19/02/2016
Helder
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
Clique aqui para fazer login e interagir na Comunidade :)