MAIORES VALORES COM FIREBIRD
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.
eu vejo ele relacionado ao favorecido
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.
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.
Decima 15,2
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.
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.
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.
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..