Usuário com melhor resposta
Comando para SQL para mostrar vendas de anos anteriores

Pergunta
-
olá boa noite! estou com uma duvida em como fazer para mostrar uma consulta do banco de dados sql em uma única linha
tenho um banco de dados com valores de vendas do ano todo e gostaria de mostrar esse valores em uma linha só, isso eu ate consigo fazer, só que eu não consigo fazer a consulta buscar valores de anos anteriores tipo , todas as vendas que foram feitas no ano de 2016, 2017. gostaria de saber se alguém pode me ajudar com o comando que faz esse tipo de pesquisa no sql ?
OBS: Projeto em Windows form em C# visual studio
{ string strconexao = projectSale.Properties.Settings.Default.strconexao; SqlConnection conexao = new SqlConnection(strconexao); conexao.Open(); string consulta = "SELECT SUM (totalpago) FROM Vendas WHERE data > 9"; SqlCommand objcomando = new SqlCommand(consulta, conexao); SqlDataReader registros = objcomando.ExecuteReader(); if (registros.HasRows) while (registros.Read()) { Variables.VariableFour = registros[0].ToString(); // Faz a Soma e Salva Nessa Variavel } }
string strconexao = projectSale.Properties.Settings.Default.strconexao; SqlConnection conexao = new SqlConnection(strconexao); conexao.Open(); string consulta = " SELECT SUM (year) FROM Vendas "; SqlCommand objcomando = new SqlCommand(consulta, conexao); SqlDataReader registros = objcomando.ExecuteReader(); listView4.View = View.Details; listView4.Columns.Add("Ano Comercial", 100, HorizontalAlignment.Left); listView4.Columns.Add("Vendas No 1º Trimestre", 150, HorizontalAlignment.Left); listView4.Columns.Add("Vendas No 2º Trimestre", 150, HorizontalAlignment.Left); listView4.Columns.Add("Vendas No 3º Trimestre", 150, HorizontalAlignment.Left); listView4.Columns.Add("Vendas No 4º Trimestre", 150, HorizontalAlignment.Left); if (registros.HasRows) while (registros.Read()) {
// Variáveis contendo todas as somas e ano ListViewItem lvi = new ListViewItem(Variables.VariableYearDt); lvi.SubItems.Add(Variables.VariableOne); lvi.SubItems.Add(Variables.VariableTwo); lvi.SubItems.Add(Variables.VariableThree); lvi.SubItems.Add(Variables.VariableFour); listView4.Items.Add(lvi); }
Como podem ver na imagem acima, eu consigo mostrar os valores trimestrais, porem eu não consigo mosttrar os valores de anos anteriores.
James Miranda
Respostas
-
Bom dia James,
Eu montei um exemplo que pode ser útil para o seu caso. Particularmente, para montar relatórios eu prefiro trazer a informação "mais pronta" possível do banco de dados para não precisar de muito processamento na aplicação. Segue o exemplo:
SELECT ano, p.[1] AS trimestre1, p.[2] AS trimestre2, p.[3] AS trimestre3, p.[4] AS trimestre4 FROM ( SELECT YEAR(v.Data) AS ano, DATEPART(QQ, v.Data) AS trimestre, SUM(totalpago) AS valor FROM Venda v --WHERE... (se tiver algum filtro) GROUP BY YEAR(v.Data), DATEPART(QQ, v.Data) )dados PIVOT(SUM(valor) FOR trimestre in ([1], [2], [3], [4])) p
Tem alguns pontos importantes que vale destacar.
Para separar por trimestre, usei a função DATEPART com o parâmetro QQ que retorna 1, 2, 3 ou 4 (trimestre) de acordo com a data, depois disso, tem o agrupamento por ano e por trimestre para já trazer a soma de "totalpago" pronta. E por fim, usei o PIVOT que basicamente pega o resultado subquery "dados" que vai ser uma lista contendo os 3 campos (ano, trimestre e valor) e monta uma matriz contendo o ano e os campos 1, 2, 3 e 4 que já é o valor calculado de cada trimestre.
Com isso, na aplicação, você só precisaria buscar a informação do banco de dados e mostrar na tela. Provavelmente você vai precisar fazer algumas adaptações, mas algo desse tipo, acredito que pode servir.
Espero ter ajudado.
- Editado João Otávio A segunda-feira, 4 de junho de 2018 12:38
- Sugerido como Resposta Matheus S. Campos segunda-feira, 4 de junho de 2018 13:15
- Marcado como Resposta Filipe B CastroModerator sexta-feira, 22 de junho de 2018 19:23
Todas as Respostas
-
Bom dia James,
Eu montei um exemplo que pode ser útil para o seu caso. Particularmente, para montar relatórios eu prefiro trazer a informação "mais pronta" possível do banco de dados para não precisar de muito processamento na aplicação. Segue o exemplo:
SELECT ano, p.[1] AS trimestre1, p.[2] AS trimestre2, p.[3] AS trimestre3, p.[4] AS trimestre4 FROM ( SELECT YEAR(v.Data) AS ano, DATEPART(QQ, v.Data) AS trimestre, SUM(totalpago) AS valor FROM Venda v --WHERE... (se tiver algum filtro) GROUP BY YEAR(v.Data), DATEPART(QQ, v.Data) )dados PIVOT(SUM(valor) FOR trimestre in ([1], [2], [3], [4])) p
Tem alguns pontos importantes que vale destacar.
Para separar por trimestre, usei a função DATEPART com o parâmetro QQ que retorna 1, 2, 3 ou 4 (trimestre) de acordo com a data, depois disso, tem o agrupamento por ano e por trimestre para já trazer a soma de "totalpago" pronta. E por fim, usei o PIVOT que basicamente pega o resultado subquery "dados" que vai ser uma lista contendo os 3 campos (ano, trimestre e valor) e monta uma matriz contendo o ano e os campos 1, 2, 3 e 4 que já é o valor calculado de cada trimestre.
Com isso, na aplicação, você só precisaria buscar a informação do banco de dados e mostrar na tela. Provavelmente você vai precisar fazer algumas adaptações, mas algo desse tipo, acredito que pode servir.
Espero ter ajudado.
- Editado João Otávio A segunda-feira, 4 de junho de 2018 12:38
- Sugerido como Resposta Matheus S. Campos segunda-feira, 4 de junho de 2018 13:15
- Marcado como Resposta Filipe B CastroModerator sexta-feira, 22 de junho de 2018 19:23
-
-
Boa tarde,
Por falta de retorno essa thread está encerrada.
Se necessário favor abrir uma nova thread.
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.