none
Problemas com COMPUTE e SUM RRS feed

  • Pergunta

  • Olá pessoal, estou fazendo o seguinte SELECT:
    WITH Consulta AS (
    SELECT Compras.idCompra
          ,Compras.idUsuario
          ,Compras.idCesta
          ,Compras.idPedido
          ,Compras.idProduto
          ,Compras.quantidade
          ,Compras.estado
          ,Compras.data
     ,Pedidos.idPedido
          ,Produtos.idProduto
     ,Produtos.valor
     ,Produtos.produto
     ,SUM(Compras.quantidade * Produtos.valor) AS Total
      FROM Compras, Pedidos, Produtos
    WHERE 
    Pedidos.idPedido = '121'
    AND Pedidos.idPedido = Compras.idPedido
    AND Produtos.idProduto = Compras.idProduto
    GROUP BY Compras.idCompra
          ,Compras.idUsuario
          ,Compras.idCesta
          ,Compras.idPedido
          ,Compras.idProduto
          ,Compras.quantidade
          ,Compras.estado
          ,Compras.data
     ,Pedidos.idPedido
          ,Produtos.idProduto
     ,Produtos.valor
     ,Produtos.produto)

    SELECT * FROM Consulta

    COMPUTE SUM(Total)

    --------

    e está dando o seguinte erro:
    Msg 8156, Level 16, State 1, Line 1 The column 'idPedido' was specified multiple times for 'Consulta'.
    Alguem pode me ajudar?
    quarta-feira, 24 de setembro de 2008 18:50

Respostas

  • Boa Tarde,

     

    O problema não é com a cláusula COMPUTE mas com a definição de sua CTE. CTE, Views e Subqueries (Derived Table) necessitam de nomes específicos. No seu SELECT você chama a coluna idPedido duas vezes (uma da tabela Compras e outra da tabela Pedidos). Normalmente você poderia chamar de uma tabela só, mas mesmo que você chame de duas tabelas, você não pode manter o mesmo nome.

     

    Nesse caso, você pode colocar um Alias. Ex:

    Compras.IdPedido As IdPedidoCompra, Pedidos.IdPedido As IdPedidoPedido

     

    Ou se preferir especifique as colunas da CTE. Ex:

     

    With Consulta (Coluna1, Coluna2, Coluna3)

    AS

    (SELECT)

     

    Como sugestão complementar (não está relacionado ao problema) eu sugeriria utilizar JOINs. Junções em cláusula WHERE não são recomendadas

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 24 de setembro de 2008 19:02

Todas as Respostas

  • Boa Tarde,

     

    O problema não é com a cláusula COMPUTE mas com a definição de sua CTE. CTE, Views e Subqueries (Derived Table) necessitam de nomes específicos. No seu SELECT você chama a coluna idPedido duas vezes (uma da tabela Compras e outra da tabela Pedidos). Normalmente você poderia chamar de uma tabela só, mas mesmo que você chame de duas tabelas, você não pode manter o mesmo nome.

     

    Nesse caso, você pode colocar um Alias. Ex:

    Compras.IdPedido As IdPedidoCompra, Pedidos.IdPedido As IdPedidoPedido

     

    Ou se preferir especifique as colunas da CTE. Ex:

     

    With Consulta (Coluna1, Coluna2, Coluna3)

    AS

    (SELECT)

     

    Como sugestão complementar (não está relacionado ao problema) eu sugeriria utilizar JOINs. Junções em cláusula WHERE não são recomendadas

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 24 de setembro de 2008 19:02
  • Muito obrigado, deu tudo certo,

    a respeito da sua sugestão, saberia me informar algum tutorial?

    Obrigado

    quarta-feira, 24 de setembro de 2008 19:08
  • Olá Eduardo,

     

    Eu sugiro que você dê uma olhada no programa MSDN Experience.

    Nesse programa fiz um vídeos de pouco mais de uma hora explicando o funcionamento dos JOINs.

    Vale a pena dar uma conferida. O link para o programa MSDN Experience de SQL Server é:

     

    http://www.microsoft.com/brasil/msdn/experience/default.mspx

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 24 de setembro de 2008 19:18