MAIORES VALORES COM FIREBIRD

SANROMAN 03/07/2017 21:44:50
#474977
Boa noite amigos.

Como faço para consultar registros em uma tabela firebird e retornar a somatória dos valores dos 10 maiores.
Com o código abaixo retorna os 10 primeiros e não é isso que quero.
O código é o seguinte:
  Using con As FbConnection = conectarFirebird()

con.Open()

Try
Using strCom As FbCommand = New FbCommand([Ô]SELECT FIRST 10(Favorecido), SUM(Valor) as Valor [Ô] & _
[Ô]FROM tbDespesa [Ô] & _
[Ô]WHERE EXTRACT(MONTH FROM Data) = @mes [Ô] & _
[Ô]AND EXTRACT(YEAR FROM Data) = @ano [Ô] & _
[Ô]AND Titular = @titular [Ô] & _
[Ô]AND Login = @login [Ô] & _
[Ô]GROUP BY Favorecido [Ô] & _
[Ô]ORDER BY Valor [Ô], con)

strCom.Parameters.AddWithValue([Ô]@mes[Ô], txtMesRef.Text)
strCom.Parameters.AddWithValue([Ô]@ano[Ô], txtAnoRef.Text)
strCom.Parameters.AddWithValue([Ô]@titular[Ô], txtTitular.Text)
strCom.Parameters.AddWithValue([Ô]@login[Ô], frmLogin.cbNome.Text)

Using da As FbDataAdapter = New FbDataAdapter(strCom)

Dim ds = New DataSet

da.Fill(ds, [Ô]tbDespesa[Ô])


Fico no aguardo e desde já agradeço.
NICKOSOFT 04/07/2017 08:13:30
#474979
o first 10 nao tem q estar relacionado ao campo q vc deseja os 10 primeiros?
eu vejo ele relacionado ao favorecido
GUIMORAES 04/07/2017 08:54:19
#474980
para retornar o maior valor, utilize o MAX(campo)
SANROMAN 04/07/2017 10:58:08
#474984
Bom dia NICKSOFT

Eu não quero os 10 primeiros, eu quero os 10 favorecidos que mais receberam durante o mês, fazendo uma somatória desses valores.

Dessa forma:

João - 10,00
Maria - 15,00
João - 5,00
Claudio - 2,00
João - 1,00
Pedro - 10,00
Tereza - 5,00
Flavia - 2,00
Matilde - 4,00
Juarez - 5,00
Pedro - 5,00
Helena - 1,00
Clovis - 1,00

Retornando:

João - 16,00
Pedro - 15,00
Maria - 15,00
e assim por diante

Ou seja, a consulta pega todos os favorecidos, soma os valores de cada um e retorna os 10 maiores,

Não sei se me fiz entender, espero que sim.

GUIMORAES 04/07/2017 11:05:51
#474985
Qual é o tipo do campo valor no seu banco de dados?
SANROMAN 04/07/2017 11:14:47
#474986
Bom dia GUIMORAES

Se uso o MAX realmente retorna o maior valor. Mas retorna todos o maiores valores de todos os Favorecidos. Estou montando um gráfico e quero apenas os 10 maiores Favorecidos.
E esse meu problema, montar a consulta de forma que retorne a somatória do campo Valor para os 10 Favorecidos que mais receberam.
SANROMAN 04/07/2017 11:16:09
#474987
Oi GUIMORAES

Decima 15,2
ELUCIMAR 04/07/2017 11:49:02
#474989
SANROMAN
Estou baseando esse exemplo como você postou acima, com os campos Nome e Valor:

Select First 10
Tmp.Nome,
Tmp.Valor
From
(
select
Nome,
Sum(Valor)Valor
From Venda
Group By Nome
)Tmp
Order By Tmp.Valor desc


Sempre ira retornar os 10 maiores valores por ordem decrescente.
SANROMAN 04/07/2017 12:31:48
#474992
Bom Dia Elucimar

Se construo a consulta da conforme seu exemplo:

 Using strCom As FbCommand = New FbCommand([Ô]SELECT FIRST 10 Favorecido, Valor [Ô] & _
[Ô]FROM (SELECT Favorecido, SUM(Valor) as Valor [Ô] & _
[Ô]FROM tbDespesa [Ô] & _
[Ô]WHERE EXTRACT(MONTH FROM Data) = @mes [Ô] & _
[Ô]AND EXTRACT(YEAR FROM Data) = @ano [Ô] & _
[Ô]AND Titular = @titular [Ô] & _
[Ô]AND Login = @login [Ô] & _
[Ô]GROUP BY Favorecido)[Ô] & _
[Ô]ORDER BY Valor ASC[Ô], con)

strCom.Parameters.AddWithValue([Ô]@mes[Ô], txtMesRef.Text)
strCom.Parameters.AddWithValue([Ô]@ano[Ô], txtAnoRef.Text)
strCom.Parameters.AddWithValue([Ô]@titular[Ô], txtTitular.Text)
strCom.Parameters.AddWithValue([Ô]@login[Ô], frmLogin.cbNome.Text)


Retorna os primeiros 10 registros de minha tabela. Não é o que preciso.

Se construir a consulta dessa forma:

  Using strCom As FbCommand = New FbCommand([Ô]SELECT Favorecido, SUM(Valor) AS Valor [Ô] & _
[Ô]FROM tbDespesa [Ô] & _
[Ô]WHERE EXTRACT(MONTH FROM Data) = @mes [Ô] & _
[Ô]AND EXTRACT(YEAR FROM Data) = @ano [Ô] & _
[Ô]AND Titular = @titular [Ô] & _
[Ô]AND Login = @login [Ô] & _
[Ô]GROUP BY Favorecido [Ô] & _
[Ô]ORDER BY Valor ASC[Ô], con)

strCom.Parameters.AddWithValue([Ô]@mes[Ô], txtMesRef.Text)
strCom.Parameters.AddWithValue([Ô]@ano[Ô], txtAnoRef.Text)
strCom.Parameters.AddWithValue([Ô]@titular[Ô], txtTitular.Text)
strCom.Parameters.AddWithValue([Ô]@login[Ô], frmLogin.cbNome.Text)


Retorna os Favorecidos com a somatória de seu valor. E isso que preciso, só que retorna todos os Favorecidos e fica inviável construir um gráfico.
Preciso que retorne apenas a somatória dos 10 maiores Favorecidos.
ELUCIMAR 04/07/2017 14:34:56
#474998
SANROMAN

Citação:

Se construir a consulta dessa forma:

Using strCom As FbCommand = New FbCommand([Ô]SELECT Favorecido, SUM(Valor) AS Valor [Ô] & _
[Ô]FROM tbDespesa [Ô] & _
[Ô]WHERE EXTRACT(MONTH FROM Data) = @mes [Ô] & _
[Ô]AND EXTRACT(YEAR FROM Data) = @ano [Ô] & _
[Ô]AND Titular = @titular [Ô] & _
[Ô]AND Login = @login [Ô] & _
[Ô]GROUP BY Favorecido [Ô] & _
[Ô]ORDER BY Valor ASC[Ô], con)



Esta parte aqui ficou incorreta: [Ô]ORDER BY Valor ASC[Ô], con)
O correto é: [Ô]ORDER BY Valor DESC[Ô], con)

Assim vai pegar em ordem decrescente os 10 primeiros maiores valores.
SANROMAN 04/07/2017 15:20:37
#475000
Elucimar, muito obrigado

Quebrei a cabeça um tempão e era só mudar a ordem para DESC.

Vou continuar pesquisando o porque disso. Não tem lógica...

O que vc acha. Assim que vc responder darei como encerrado o Tópico.

O código ficou assim:

 Using strCom As FbCommand = New FbCommand([Ô]SELECT FIRST 10 Favorecido, Valor [Ô] & _
[Ô]FROM (SELECT Favorecido, SUM(Valor) as Valor [Ô] & _
[Ô]FROM tbDespesa [Ô] & _
[Ô]WHERE EXTRACT(MONTH FROM Data) = @mes [Ô] & _
[Ô]AND EXTRACT(YEAR FROM Data) = @ano [Ô] & _
[Ô]AND Titular = @titular [Ô] & _
[Ô]AND Login = @login [Ô] & _
[Ô]GROUP BY Favorecido)[Ô] & _
[Ô]ORDER BY Valor DESC[Ô], con)


Cara valeu mesmo. Não consigo continuar se não resolver o que está pendente rs..
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas