Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

flavioavilela

[Resolvido] sql

Recommended Posts

estou fazendo alguns selects aqui... estou com uma dúvida na clausula group by... nela, tem que estar contendo todos os campos que eu mandei mostrar ou nao? qual a lógica disso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não necessariamente port3r... as vezes, um select simples pode gerar registros duplicados por conter dados que se diferem em apenas uma ou duas colunas que não estão sendo consideradas... ai o uso de um group by ou um distinct resolve o problema. Fora isso, é como você falou port3r... joga-se no group by tudo o que não tiver função de grupo no select.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O detalhe é que na "maioria" das vezes, você declara os campos que quer fazer agrupamento, e utiliza uma função de agrupamento em algum campo, então o que não tem função de grupo, vai para o "group by", senão o banco de dados "grita".

 

Eu particularmente não entendi o seu exemplo de "select simples pode gerar registros duplicados" ... "conter dados que se diferem em apenas".

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo, para melhor debatermos, aqui vai um exemplo 'simples':

with dm.qryrancking_vendas do
		begin
		  close;
		  sql.Clear;
		  sql.Add('select V.N_Pedido, V.Cliente, V.Data_Pedido, IV.Codigo_Produto, IV.Nome_Produto, IV.Valor_Venda, IV.Quantidade, IV.Sub_Total from Venda V');
		  sql.Add('inner join Itens_Venda IV on(V.N_Pedido = IV.N_Pedido)');
		  sql.Add('where V.Data_Pedido between :Data_Inicial and :Data_Final and V.Funcionario = :Funcionario group by V.Cliente');
		  Parameters.ParamByName('Data_Inicial').Value:= StrToDateTime(EdtData_Inicial.Text);
		  Parameters.ParamByName('Data_Final').Value:= StrToDateTime(EdtData_Final.Text);
		  Parameters.ParamByName('Funcionario').Value:= EdtParametro.Text;
		  open;

a minha intenção aqui é pegar os dados referente a uma venda, onde tenho a tabela Venda e Itens_Venda e mostrar num dbgrid...

ao executar esse código, ele fala que falta declarar o N_Pedido no group by... ai eu declaro ele e falta que tem q declarar a Data_Pedido e por ai vai.. eu queria agrupar por funcionários, se existir mais de um funcionario, ele agrupar.... por isso que quero, principalmente, entender esse esquema do group by para sempre que tiver outros, eu souber fazer sem dúvidas....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não está utilizando nenhuma função de agrupamento no seu "select", ele vai ficar te solicitando os campos faltantes mesmo.

 

O que você quer fazer ranking? Pra fazer ranking, provavelmente você quer fazer algo em cima da quantidade que um funcionário vendeu, ou então sobre o valor total da venda.

 

Para agrupar um desses campos "quantidade" ou "valor total da venda" em referência ao "funcionário", você tem que fazer +/- assim:

 

select funcionario, sum(quantidade) from tabelas

where funcionario = filtroFuncionario

and periodo between dataInicial and dataFinal

group by funcionario

 

Aí ele vai te retornar o que o funcionario vendeu em quantidades.

 

É esse o raciocínio.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi, funcionou... mas, só para completar meu raciocinio... se por acaso eu querer dar um select e colocar uns 5, 6 campos... nao vou poder utilizar o group by, nao é isso? pois, com esse tanto de campo, nao tem como agrupar... seria isso???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for usar o group by, tem que por todos os campos, menos campos com funções como count e sum, que são funções. Senão, geralmente um order by resolve bem.

 

Agora, respondendo a questão do port3r... eu já tive problemas com tabelas antigas de sistemas que dei suporte que tinham relações NxN entre elas onde consultas pegavam apenas algumas colunas de dados e as vezes elas exigiam um teste para ver se o registro existia numa tabela que podia ter N vezes a chave de ligação repetida e sem ter outras opções de filtro além dela nela... ai pra evitar duplicações ou usava o distinct ou o group by em todos os campos da consulta para forçar a voltar apenas 1 linha... meio gambi, mas é situação que pode ocorrer. Não tô lembrando agora de um exemplo pra por aqui.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.