SELECT SUM COM GROUP

MARCELO.VB.PIRA 10/12/2006 20:11:31
#189146
Oi pessoar!!!

tà' com um probleminha:

eu tenho uma tabela com as seguintes caracteristicas:

Nome da Tabela
PEDIDOVENDA

campos:
DATAVENDA
CODIGO
PRODUTO
QUANTIDADE

Preciso pegar os 20 produtos mais vendidos dentro de um determinado intervalo de datas. Observem bem: O que vai definir a colocação dele não é quantas vezes ele apareceu na tabela, e sim a soma do campo QUANTIDADE. Isso significa que o produto X que foi vendido 200 vezes (um produto a cada venda, ou uma linha de registro no bd para cada ocorrência) foi menos vendidos que o produto Y que foi vendido apenas tres vezes, mas em cada venda foram vendidas 300 unidades que somariam 900.

Estou tentando assim (e algumas variações sobre o mesmo tema) mas não esta funcionando:

  Combo1.Clear
Set RsGeral = New ADODB.Recordset
RsGeral.Open "SELECT top 50 count(Quantidade) AS total,codigo,produto FROM pedidovenda where datavenda between CDate('" & TxDataCaixa1.FormattedText & "') And CDate('" & TxDataCaixa2.FormattedText & "') GROUP BY total,codigo,produto", ConexaoBD, adOpenForwardOnly, adLockOptimistic
For a = 1 To RsGeral.RecordCount
Combo1.AddItem PADL(RsGeral!total, 10) & " - " & RsGeral!Produto
RsGeral.MoveNext
Next a
RsGeral.Close
Set RsGeral = Nothing


O combo até é preenchido, mas com valores que não são corretos.

O que fazer?

E agora? quem poderá me ajudar?

Algum chapolin colorado no recinto?
MARCELO.VB.PIRA 10/12/2006 20:51:13
#189152
Olá... mudei alguma coisa... deu quase certo, o problema é que tem registros se repetindo como podem ver no resultado abaixo:

  Text1 = ""
Set RsGeral = New ADODB.Recordset
RsGeral.Open "SELECT top 50 sum(Quantidade) AS total,produto,quantidade,codigo FROM pedidovenda where cdate(datavenda) between CDate('" & TxDataCaixa1.FormattedText & "') And CDate('" & TxDataCaixa2.FormattedText & "') GROUP BY produto,quantidade,codigo,total", ConexaoBD, adOpenForwardOnly, adLockOptimistic
For a = 1 To RsGeral.RecordCount
Text1 = Text1 & PADL(RsGeral!total, 10) & " - " & RsGeral!codigo & " - " & RsGeral!Produto & vbNewLine
RsGeral.MoveNext
Next a
RsGeral.Close
Set RsGeral = Nothing



Citação:

1 - 0000002755 - ABERTURA COMPLETA DE MOTOR 100/150CC
1 - 0000002763 - ABERTURA SUPERIOR DE MOTOR 100/150CC
300 - 0000001385 - ACIONADOR CORRENTE COMANDO TENSIFLEX
1 - 0000003127 - ADESIVO DECORATIVOS
13 - 0000003127 - ADESIVO DECORATIVOS
2 - 0000003127 - ADESIVO DECORATIVOS
3 - 0000003127 - ADESIVO DECORATIVOS
44 - 0000003127 - ADESIVO DECORATIVOS
6 - 0000003127 - ADESIVO DECORATIVOS
1 - 0000002992 - ADESIVO RESINADO DA TAMPA DO TANQUE
2 - 0000002950 - ALINHAMENTO DE CHASSIS
1 - 0000002764 - ALINHAMENTO DE RODA RAIADA(UNITàRIO)
1 - 0000001405 - ANEL LIMITADOR DA CAIXA DE VELOCIDADE 44680-410-000
1 - 0000001416 - ANEL VEDAÇÃO DA CUBA DO CARBURADOR.
1 - 0000001409 - ANEL VEDAÇÃO DO COLETOR DE ADEMISSÃO
2 - 0000001409 - ANEL VEDAÇÃO DO COLETOR DE ADEMISSÃO
1 - 0000001422 - ANEL VEDAÇÃO DO INJETOR DO CARBURADOR ECCO
1 - 0000001443 - ARO DO FAROL REDONDO PRETO
1 - 0000001446 - ARROELA LISA 06 X 12 4400
1 - 0000001457 - BATENTE DO CAVALETE CENTRAL 95011-62000
1 - 0000001459 - BATERIA G.S.I CT4L-BS
1 - 0000001460 - BATERIA G.S.I CT5L-BS
2 - 0000001503 - BUCHA BI PARTIDA DO ESCAPE 3710
2 - 0000001506 - BUCHA BI PARTIDA DO ESCAPE 4620
1 - 0000001511 - BUCHA DA COROA
8 - 0000001510 - BUCHA DA COROA
12 - 0000001511 - BUCHA DA COROA
2 - 0000001523 - BUCHA DO GARFO TRASEIRO
1 - 0000002874 - BUCHA ESPAÇADORA DO EIXO DA RODA(DIVERSAS)
1 - 0000001546 - CABO DE ACELERADOR B CONTROLFLEX
1 - 0000001551 - CABO DE ACELERADOR B SCHERER
1 - 0000001575 - CABO DE EMBREAGEM CONTROLFLEX
1 - 0000001578 - CABO DE EMBREAGEM CONTROLFLEX
1 - 0000001620 - CABO DE VELOCIMETRO CONTROLFLEX
1 - 0000001630 - CABO DE VELOCàMETRO SCHERER
1 - 0000001631 - CABO DE VELOCàMETRO SCHERER
1 - 0000001637 - CACHIMBO DE VELA
3 - 0000001641 - CAIXA DE DIREÇÃO
1 - 0000001655 - CAMARA DE AR DIANT/TRAS.300X18
2 - 0000001655 - CAMARA DE AR DIANT/TRAS.300X18
3 - 0000001655 - CAMARA DE AR DIANT/TRAS.300X18
1 - 0000001661 - CAPA DA CORRENTE
1 - 0000001667 - CAPA DA MANETE DIREITA 53173-KYO-970
1 - 0000001669 - CAPA DA MANETE ESQUERDA 53174-KYO-970
2 - 0000003229 - CAPACETE EBF 7 PLUS
3 - 0000002780 - CARBURAÇÃO 100/125CC
1 - 0000001686 - CARCAÇA DO FAROL REDONDO
1 - 0000001691 - CARCAÇA INFERIOR DO PAINEL
1 - 0000001698 - CARCAÇA INTERMEDIARIA DO PAINEL
1 - 0000001707 - CARCAÇA SUPERIOR DO PAINEL


MARCELO.VB.PIRA 10/12/2006 22:19:51
#189178
Depois de muita luta e muita ajuda do Sr. Capella, chegamos quase ao final da jornada. A rotina teve algumas "gambiarras" (gambiarras essas que não tiveram a participação do Sr. Celso capella, que JAMAIS participaria de gambiarras) mas está quase pronta. Eis a criatura:

  Text1 = ""
Set RsGeral = New ADODB.Recordset
sSql = "SELECT distinct sum(val(PedidoVenda.Quantidade)) AS TotalVenda, PedidoVenda.codigo,Produtos.Nome FROM pedidovenda, PRODUTOs where PedidoVenda.Codigo = Produtos.Codigo AND (cdate(datavenda) between CDate('" & TxDataCaixa1.FormattedText & "') And CDate('" & TxDataCaixa2.FormattedText & "')) GROUP BY val(PedidoVenda.Quantidade), PedidoVenda.codigo, Produtos.Nome "
RsGeral.Open sSql, ConexaoBD, adOpenForwardOnly, adLockOptimistic
RsGeral.MoveLast
For a = RsGeral.RecordCount To RsGeral.RecordCount - 50 Step -1
If a < 1 Then Exit For
Set RsPro = New ADODB.Recordset
RsPro.Open "select * from produtos where codigo='" & RsGeral!codigo & "'", ConexaoBD, adOpenDynamic, adLockOptimistic
Text1 = Text1 & PADL(RsGeral!totalvenda, 10) & " - " & RsGeral!codigo & " - " & RsPro!Nome & " - " & vbNewLine
RsPro.Close
Set RsPro = Nothing
RsGeral.MovePrevious
Next a
RsGeral.Close
Set RsGeral = Nothing


Ela está quase perfeita, o problema é que ela teima em repetir alguns registros, mesmo usando o DISTINCT.

O resultado desta rotina está estampado abaixo, para que vocês percebam que o produto ADESIVO DECORATIVO (por exemplo) saiu repetido varias vezes:

Citação:

300 - 0000001385 - ACIONADOR CORRENTE COMANDO TENSIFLEX -
44 - 0000003127 - ADESIVO DECORATIVOS -
13 - 0000003127 - ADESIVO DECORATIVOS -
12 - 0000002933 - MÃO DE OBRA MECANICA -
12 - 0000002483 - PRISIONEIRO DA COROA -
12 - 0000002465 - PORCA FRANGE 10 MM 1100 -
12 - 0000001511 - BUCHA DA COROA -
8 - 0000002235 - Ó“LEO LUBRIFICANTE IPIRANGA 20/50 4T -
8 - 0000001747 - CINTA PLàSTICA 20 CM -
8 - 0000001510 - BUCHA DA COROA -
7 - 0000003215 - Ó“LEO LUBRIFICANTE DEITON 20/50 4T -
7 - 0000002236 - Ó“LEO LUBRIFICANTE MOBIL 20/50 SUPER 4T -
6 - 0000003215 - Ó“LEO LUBRIFICANTE DEITON 20/50 4T -
6 - 0000003127 - ADESIVO DECORATIVOS -
6 - 0000002612 - SINALEIRA MINI FUME ESCURO -
6 - 0000001795 - CORRENTE TRANSMISSÃO 428HX116 -
6 - 0000001655 - CAMARA DE AR DIANT/TRAS.300X18 -
5 - 0000003043 - TROCA DE PNEU -
5 - 0000002802 - TROCA DE TRANSMISSÃO 100/350CC -
5 - 0000002381 - PINHÃO TRANSMISSÃO 14Z -
5 - 0000002268 - PARAFUSO FRANGE 6X35 3520 -
5 - 0000002235 - Ó“LEO LUBRIFICANTE IPIRANGA 20/50 4T -
4 - 0000003072 - ROSCA M06 -
4 - 0000002968 - SERVIÇO DE TERCEIRO -
4 - 0000002612 - SINALEIRA MINI FUME ESCURO -
4 - 0000002439 - PNEU TRASEIRO LEVORIN 90X90X18 -
4 - 0000002267 - PARAFUSO FRANGE 6X32 3510 -
4 - 0000002232 - Ó“LEO LUBRIFICANTE ATF -
4 - 0000002150 - LENTE DA SINALEIRA FUME ESCURO -
4 - 0000002120 - LÓ¡MPADA DO PISCA 12V 10W -
4 - 0000002109 - LÓ¡MPADA DA LANT./FREIO TRASEIRO -
4 - 0000002012 - JUNTA ANEL DO ESCAPE -
4 - 0000001922 - FUSàVEL DE VIDRO 15 A -
4 - 0000001785 - COROA TRANSMISSÃO 44Z -
4 - 0000001746 - CINTA PLàSTICA 15 CM -
3 - 0000003127 - ADESIVO DECORATIVOS -
3 - 0000003074 - PEÇAS DE TERCEIRO -
3 - 0000002780 - CARBURAÇÃO 100/125CC -
3 - 0000002421 - PNEU DIANTEIRO LEVORIN 2.75X18 -
3 - 0000002323 - PASTILHA DE FREIO DIANTEIRO -
3 - 0000002236 - Ó“LEO LUBRIFICANTE MOBIL 20/50 SUPER 4T -
3 - 0000002117 - LÓ¡MPADA DO PISCA 12V 10W -
3 - 0000002106 - LÓ¡MPADA DO FAROL BIODO 12V 35/35W -
3 - 0000001948 - GRAXA BRANCA 80G -
3 - 0000001895 - ESPELHO RETROVISOR MICRO LD -
3 - 0000001641 - CAIXA DE DIREÇÃO -
2 - 0000003229 - CAPACETE EBF 7 PLUS -
2 - 0000003215 - Ó“LEO LUBRIFICANTE DEITON 20/50 4T -
2 - 0000003127 - ADESIVO DECORATIVOS -
2 - 0000002950 - ALINHAMENTO DE CHASSIS -
2 - 0000002897 - CHAVEIRO DIVERSOS -



Alguma ideia amigos???
USUARIO.EXCLUIDOS 10/12/2006 23:03:20
#189183
Tente usar distinct no campo codigo

USUARIO.EXCLUIDOS 10/12/2006 23:14:48
#189184
Desconsidere meu post anterior, continuo na pesquisa
USUARIO.EXCLUIDOS 10/12/2006 23:25:00
#189187
Uma tentativa não seria mudar o GROUP BY primeiramente para o código do produto.

Axo que é isto por que group funciona assim e acho que todos que tiverem a mesma quantidade e código ficam agrupados em lugares diferentes.

|_Grupo_1
|_Grupo_2 Item A
|_Grupo_2 Item B
|_Grupo_2 Item C
|_Grupo_3 Item A
|_Grupo_3 Item B
|_Grupo_3 Item C
|_Grupo_3 Item D

USUARIO.EXCLUIDOS 10/12/2006 23:30:16
#189189
Verifique na tabela se:

44 - 0000003127 - ADESIVO DECORATIVOS - (São em pedidos 22 pedidos com 2 unidades)
13 - 0000003127 - ADESIVO DECORATIVOS - (São em pedidos 13 pedidos com 1 unidade)
MARCELO.VB.PIRA 11/12/2006 00:23:22
#189194
as ocorrências para o produto 0000003127 - ADESIVO DECORATIVOS são:

44
1
13
6
3
2

Obrigado pela força
HUGOSSOUZA 11/12/2006 08:33:33
#189204
Resposta escolhida
pq vc coloca a quantidade no group by?
vc ja tentou tirar?

sSql = "SELECT distinct sum(val(PedidoVenda.Quantidade)) AS TotalVenda, PedidoVenda.codigo,Produtos.Nome FROM pedidovenda, PRODUTOs where PedidoVenda.Codigo = Produtos.Codigo AND (cdate(datavenda) between CDate('" & TxDataCaixa1.FormattedText & "') And CDate('" & TxDataCaixa2.FormattedText & "')) GROUP BY PedidoVenda.codigo, Produtos.Nome "

USUARIO.EXCLUIDOS 11/12/2006 19:56:17
#189391
marcelão, to meio enferrujado em linguagem SQL mas o que o hugo disse tem total fundamento.

Era exatamente o que eu queria dizer, mas n lembrava como.

A minha rotina também funcionaria, mas com a do hugo da pra tirar inclusive o distinct agrupando primeiramente pelo codigo do produto.
CLEVERTON 11/12/2006 20:21:34
#189395
Marcelo, se estiver dando erro faça dê um
DEBUG.Print SuaSQL

e vá ao criador de consultas (MODO SQL) pra ver onde está o problema

ou então crie a consulta diretamente no access e traga para o VB
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas