SQL SERVER contando campos
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.
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
Curtidas 0
Melhor post
Claudio Lopes
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
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
GOSTEI 1
Mais Respostas
Libio Souza
16/02/2016
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.
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.
GOSTEI 0
Claudio Lopes
16/02/2016
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
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:
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
GOSTEI 0
Libio Souza
16/02/2016
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.
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.
GOSTEI 1
Isaac Jose
16/02/2016
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
GOSTEI 0
Claudio Lopes
16/02/2016
Que bom cara. Precisando estamos por ai
GOSTEI 0
Helder
16/02/2016
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
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
GOSTEI 0