none
Select dentro de select RRS feed

  • Pergunta

  • Olá Boa noite a todos!

    Estou tentando fazer a soma de todos os produtos iguais de um determinado cliente, tipo assim;

    SqlCommand comando = new SqlCommand("Select Sum(estoque) FROM venda_detalhe WHERE cod_produto = '" + Convert.ToInt32(Cod_produto) + "' LIKE '" + ( SELECT cod_cliente FROM cab_venda WHERE cod_cliente = Convert.ToInt32(Cod_cliente)+ "%'", Conn);

    esse select não esta funcionando, mas se funcionar me serve
    quarta-feira, 14 de maio de 2014 00:04

Respostas

  • Esse é o diagrama do meu banco de dados

    Na sua modelagem não estou vendo a relação entre a tabela client e venda_detalhe, tem uma intermediária entre elas , que é a cab_venda, logo você deve incluir ela no seu inner join.

    Ficando assim: 

    SELECT SUM(ven.estoque) FROM venda_detalhe ven
    
    INNER JOIN cab_venda cab c on cab.cod_cab_venda =  ven.cod_cab_venda
    
    INNER JOIN cliente cli on cli.cod_cliente  =  cab.cod_cliente
    
    WHERE ven.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND cli.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "'
                      

    Para evitar perda de tempo com dados nulos do banco, execute a query manualmente no Sql Server Managment e verifique se o retorno é válido. Para evitar passar um null para numérico ou outros tipos de dados, valide se o retorno é diferente de null. 

    Espero que resolva a sua dúvida, até mais. 

    quinta-feira, 15 de maio de 2014 03:25

Todas as Respostas

  • já tentei assim também e não da certo

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe WHERE cod_produto = " + Convert.ToInt32(Cod_produto) + " AND (SELECT cod_cliente FROM cab_venda WHERE cod_cliente =  " + Convert.ToInt32(Cod_cliente) + "", Conn);
                        

    não da certo
    quarta-feira, 14 de maio de 2014 00:36
  • já tentei assim também e não da certo

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe WHERE cod_produto = " + Convert.ToInt32(Cod_produto) + " AND (SELECT cod_cliente FROM cab_venda WHERE cod_cliente =  " + Convert.ToInt32(Cod_cliente) + "", Conn);
                        

    não da certo

    Olá,

    nos seus dois exemplos está faltando algo na sql, você está passando um valor, porém, não esta fazendo a comparação com alguma coluna do banco. Veja o que você está fazendo:

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe WHERE cod_produto = 8 and 10", Conn);

    Sua sql deveria ser +/- assim:

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe WHERE cod_produto = " + Convert.ToInt32(Cod_produto) + " AND NOME_DA_COLUNA_COD_CLIENTE (SELECT cod_cliente FROM cab_venda WHERE cod_cliente =  " + Convert.ToInt32(Cod_cliente) + "", Conn);

    Entendeu?


    Wennder Santos

    Se solucionou seu problema ou dúvida, não esqueça de marcar como resposta. Se foi util, não esqueça de marcar como util.






    quarta-feira, 14 de maio de 2014 00:49
  • deu Sintaxe incorreta proximo a "1"

     SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe WHERE cod_produto = " + Convert.ToInt32(Cod_produto) + " AND cod_cliente = (SELECT cod_cliente FROM cliente WHERE cod_cliente =  " + Convert.ToInt32(Cod_cliente) + "", Conn);                                                                                                                                      
                      

    quarta-feira, 14 de maio de 2014 01:01
  • tentei assim mas não deu certo

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe WHERE cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND cod_cliente = (SELECT cod_cliente FROM cliente WHERE cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "' )", Conn);                                                                                                                                      
                       

    da erro nome da coluna 'cod_cliente' inválido

    acho que é porque pertence a outra tabela talvez

    quarta-feira, 14 de maio de 2014 02:00
  • Boa noite amigo, se entendi bem você quer pegar a soma do estoque de X produto que tenha Y Cliente, certo?

    Você pode utilizar Inner Join para isso: 

    SELECT SUM(estoque) FROM venda_detalhe v 
    INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente
    where v.cod_produto = "'" + Convert.ToInt32(Cod_produto) + "'" AND c.cod_cliente = "'" + Convert.ToInt32(Cod_cliente) + "'"

    Deve-se utilizar "'" apenas se o código do cliente e código do produto forem de fato um varchar/coleção de caracteres.

    Na sua query, o erro pode indicar que a coluna "cod_cliente" não existe dentro da tabela venda_detalhe...


    quarta-feira, 14 de maio de 2014 05:37
  • È verdade Vinicios o cod_cliente não existe dentro da tabela venda_detalhe

    quarta-feira, 14 de maio de 2014 09:15
  • È verdade Vinicios o cod_cliente não existe dentro da tabela venda_detalhe

    Olá,

    a sql que o Vinícius te sugeriu funcionária perfeitamente se existisse o código do cliente na tabela venda_detalhe.

    Se não existe, porque você está tentando usa-lá como filtro?

    Existe alguma informação que vincule essas duas tabelas? 


    Wennder Santos

    Se solucionou seu problema ou dúvida, não esqueça de marcar como resposta. Se foi util, não esqueça de marcar como util.


    quarta-feira, 14 de maio de 2014 11:35
  • não há nenhum campo que vincula a tabela venda_detalhe com a tabela cliente

    quarta-feira, 14 de maio de 2014 15:53
  • não há nenhum campo que vincula a tabela venda_detalhe com a tabela cliente

    A tabela venda_detalhe são os itens de uma venda correto?
    Então essa tabela tem vinculo com alguma tabela venda por exemplo, certo?

    E essa tabela venda sim tem um vinculo com o cliente certo?

    Por favor, nos passe toda a estrutura para que fique viável ajudar.


    Wennder Santos

    Se solucionou seu problema ou dúvida, não esqueça de marcar como resposta. Se foi util, não esqueça de marcar como util.

      

     
    quarta-feira, 14 de maio de 2014 15:57
  • criei um campo cod_cliente na tabela venda_detalhe como o amigo Vinicios sugeriu mas da erro;

    Erro de sintaxe proximo a ")"

    código

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe v INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente WHERE v.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND c.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "')",Conn);

    quarta-feira, 14 de maio de 2014 16:01
  • criei um campo cod_cliente na tabela venda_detalhe como o amigo Vinicios sugeriu mas da erro;

    Erro de sintaxe proximo a ")"

    código

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe v INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente WHERE v.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND c.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "')",Conn);

    Tente utilizar essa, você deixou um ")" sobrando. 

    SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe v INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente WHERE v.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND c.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "'",Conn);

    Amigo, simulando uma query real, ficaria assim:

    SELECT SUM(estoque) FROM venda_detalhe v 
    INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente
    where v.cod_produto =100 AND c.cod_cliente = 1

    Fiz uma simulação com um banco local aqui

    SELECT SUM(v.FcamaraTax) FROM tb_vacancy v 
    INNER JOIN tb_client c on c.Id  =  v.ClientId
    where v.Id > 100000 AND c.id = 1

    quarta-feira, 14 de maio de 2014 16:15
  • Se eu selecionar um produto tipo CIMENTO do primeiro cliente ele SOMA  de todos os clientes da o total geral~.

    Se eu selecionar o produto do segundo cliente ele da erro como abaixo;

    Objeto não pode ser convertido de DBNull em outros tipos.

    quarta-feira, 14 de maio de 2014 16:25
  •  private void Somar_Produto_de_Um_Cliente()
            {
                string conexao = @"Data Source=USUARIO-PC;Initial Catalog=vimez;Persist Security Info=True;User ID=sa;Password=10";
                SqlConnection Conn = new SqlConnection(conexao);
                double soma_material = 0;
                if (Cod_produto != string.Empty && Cod_cliente != string.Empty)
                {
                    try
                    {
                        if (Conn.State == ConnectionState.Closed)
                        {
                            Conn.Open();
                            SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe v INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente WHERE v.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND c.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "'", Conn);
                            soma_material = Convert.ToDouble(comando.ExecuteScalar());
                            lblSoma.Text = soma_material.ToString();
                        }
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show("Pane no Sistema" + ex, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    finally
                    {
                        Conn.Close();
                    }
                }           
            }

    Esse é o código que estou utilizando
    quarta-feira, 14 de maio de 2014 16:27
  •  private void Somar_Produto_de_Um_Cliente()
            {
                string conexao = @"Data Source=USUARIO-PC;Initial Catalog=vimez;Persist Security Info=True;User ID=sa;Password=10";
                SqlConnection Conn = new SqlConnection(conexao);
                double soma_material = 0;
                if (Cod_produto != string.Empty && Cod_cliente != string.Empty)
                {
                    try
                    {
                        if (Conn.State == ConnectionState.Closed)
                        {
                            Conn.Open();
                            SqlCommand comando = new SqlCommand("SELECT SUM(estoque) FROM venda_detalhe v INNER JOIN cliente c on c.cod_cliente  =  v.cod_cliente WHERE v.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND c.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "'", Conn);
                            soma_material = Convert.ToDouble(comando.ExecuteScalar());
                            lblSoma.Text = soma_material.ToString();
                        }
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show("Pane no Sistema" + ex, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    finally
                    {
                        Conn.Close();
                    }
                }           
            }

    Esse é o código que estou utilizando
    O retorno do banco está sendo nulo, daí não é possível fazer a conversão. 
    quarta-feira, 14 de maio de 2014 17:25
  • Esse é o diagrama do meu banco de dados
    quinta-feira, 15 de maio de 2014 01:32
  • Esse é o diagrama do meu banco de dados

    Na sua modelagem não estou vendo a relação entre a tabela client e venda_detalhe, tem uma intermediária entre elas , que é a cab_venda, logo você deve incluir ela no seu inner join.

    Ficando assim: 

    SELECT SUM(ven.estoque) FROM venda_detalhe ven
    
    INNER JOIN cab_venda cab c on cab.cod_cab_venda =  ven.cod_cab_venda
    
    INNER JOIN cliente cli on cli.cod_cliente  =  cab.cod_cliente
    
    WHERE ven.cod_produto = '" + Convert.ToInt32(Cod_produto) + "' AND cli.cod_cliente = '" + Convert.ToInt32(Cod_cliente) + "'
                      

    Para evitar perda de tempo com dados nulos do banco, execute a query manualmente no Sql Server Managment e verifique se o retorno é válido. Para evitar passar um null para numérico ou outros tipos de dados, valide se o retorno é diferente de null. 

    Espero que resolva a sua dúvida, até mais. 

    quinta-feira, 15 de maio de 2014 03:25