none
Soma SQL

    Pergunta

  • Olá a todos

    tenho esta instrução

    Select Codigo, SUM(dbo.fi.ecusto * dbo.fi.qtt) AS CustoSE from VEN

    group by Codigo

    O meu problema é que eu queria que no SUM só me somassem os valor em um determinado campo fosse true. do tipo:

    Select Codigo, IF dbi.si.soma=true then SUM(dbo.fi.ecusto * dbo.fi.qtt) AS CustoSE from VEN

    group by Codigo

    Certamente que o exemplo que dei é um disparate, mas deve dar para ver o que pretendo fazer.

    alguém pode dar uma ajuda?

    obg

     

    segunda-feira, 1 de janeiro de 2007 23:15

Respostas

  • Rui,

    Com o exemplo que você me enviou por e-mail, eu montei a seguinte query:

    SELECT DC.Documento,  DC.Data, DC.Total, Mat.[Valor Materiais], Ser.[Valor Serviços]
    FROM (DocCab AS DC LEFT JOIN (SELECT A.Documento, Sum(B.Valor) AS [Valor Materiais]
     FROM DocCab A INNER JOIN DocLin B ON A.Documento = B.Documento
     WHERE (((B.Servico)=False))
     GROUP BY A.Documento) AS Mat ON DC.Documento = Mat.Documento) LEFT JOIN (SELECT A.Documento, Sum(B.Valor) AS [Valor Serviços]
    FROM DocCab A INNER JOIN DocLin B ON A.Documento = B.Documento
    WHERE (((B.Servico)=True))
    GROUP BY A.Documento) AS Ser ON DC.Documento = Ser.Documento;

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 2 de janeiro de 2007 16:35
  • Rui,

    DC é um alias para a tabela, por exemplo, abaixo a e b são alias para a TabelaComNomeGrande e OutraTabelaComNomeGrande:

    Select A.Codigo, B.Nome
    From TabelaComNomeGrande A, OutraTabelaComNomeGrande B

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 2 de janeiro de 2007 17:59

Todas as Respostas

  • Rui,

    Tente o seguinte:

    Select Codigo, SUM(dbo.fi.ecusto * dbo.fi.qtt) AS CustoSE from VEN
    group by Codigo
    having dbi.si.soma = true

    Outra possibilidade era você fazer uma view ou subselect com o Sum e depois fazer o join com VEN colocando como condição este campo soma = true.

    Se não funcionar, poste o relacionamento entre as tabelas, por favor.

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 2 de janeiro de 2007 01:24
  • obrigado francisco pela ajuda pois é muito importante resolver isto hoje.

    penso que a sua solução não resolve porque eu omiti uma coisa. Nessa view eu preciso de duas colunas. uma que some quando o campo da linha "soma" é true e outra que some quando é false. assim nessa view teria:

    Select Codigo, SUM(dbo.fi.ecusto * dbo.fi.qtt) AS CustoSE se soma=true, SUM(dbo.fi.ecusto * dbo.fi.qtt) AS CustoMT se soma=false from VEN
    group by Codigo

    agradeço muito se puder ajudar

    terça-feira, 2 de janeiro de 2007 10:16
  • Rui,

    Então vai ter que ser com dois subselects. Seria algo assim:

    Select A.Codigo,
    (Select SUM(fi.ecusto * fi.qtt) As CustoSE1
    From TabelaComOsDados T1
    Where T1.Chave = A.Chave
    And T1.soma = true) As CustoSE,
    (Select SUM(fi.ecusto * fi.qtt) As CustoMT1
    From TabelaComOsDados T2
    Where T2.Chave = A.Chave
    And T2.soma = true) As CustoMT
    From VEN A
    Group By Codigo

    Se não der certo, coloque a estrutura das tabelas envolvidas e os relacionamentos aqui para que possamos entender melhor.

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 2 de janeiro de 2007 10:27
  • obrigado francisco,

     

    Nesta view, como pode ver eu tenho a coluna ValorSE que é a soma dos valores dos produtos que são serviços, mas queria também ter outra com os produtos que não são serviços. É aqui que eu não consigo avançar. Pode tentar dar um jeito a este código para ver se vem daí uma luz?

    SELECT DocCab.Documento, First(DocCab.Data) AS [Data Doc], First(DocCab.Total) AS [Total Doc], Sum(DocLin.Valor) AS [Valor Serviços]
    FROM DocCab INNER JOIN DocLin ON DocCab.Documento = DocLin.Documento
    GROUP BY DocCab.Documento, DocLin.Servico
    HAVING (((DocLin.Servico)=True))

    terça-feira, 2 de janeiro de 2007 14:31
  • Rui,

    Com o exemplo que você me enviou por e-mail, eu montei a seguinte query:

    SELECT DC.Documento,  DC.Data, DC.Total, Mat.[Valor Materiais], Ser.[Valor Serviços]
    FROM (DocCab AS DC LEFT JOIN (SELECT A.Documento, Sum(B.Valor) AS [Valor Materiais]
     FROM DocCab A INNER JOIN DocLin B ON A.Documento = B.Documento
     WHERE (((B.Servico)=False))
     GROUP BY A.Documento) AS Mat ON DC.Documento = Mat.Documento) LEFT JOIN (SELECT A.Documento, Sum(B.Valor) AS [Valor Serviços]
    FROM DocCab A INNER JOIN DocLin B ON A.Documento = B.Documento
    WHERE (((B.Servico)=True))
    GROUP BY A.Documento) AS Ser ON DC.Documento = Ser.Documento;

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 2 de janeiro de 2007 16:35
  • Obrigado francisco. funcionou

    Me explica só uma coisa:

    como é que voçê consegue utilizar a tabela DC se ela não existe?

    obg

    terça-feira, 2 de janeiro de 2007 17:52
  • Rui,

    DC é um alias para a tabela, por exemplo, abaixo a e b são alias para a TabelaComNomeGrande e OutraTabelaComNomeGrande:

    Select A.Codigo, B.Nome
    From TabelaComNomeGrande A, OutraTabelaComNomeGrande B

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 2 de janeiro de 2007 17:59