none
Comando para SQL para mostrar vendas de anos anteriores RRS feed

  • 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

    segunda-feira, 4 de junho de 2018 00:36

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.



    segunda-feira, 4 de junho de 2018 12:32

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.



    segunda-feira, 4 de junho de 2018 12:32
  • Olá João Otávio, obrigado pela resposta vou tentar fazer as implementações no código e volto depois para fazer o feedback. 

    James Miranda

    segunda-feira, 4 de junho de 2018 19:00
  • 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.

    sexta-feira, 22 de junho de 2018 19:23
    Moderador