none
Fazer a soma de pontos de várias equipas. RRS feed

  • Pergunta

  • Olá agradecia uma ajuda num problema urgente,

    Tenho uma tabela que recebe a quantidade de pontos e o tempo gasto a realizar um questionário por uma determinada equipa e preciso de realizar a soma total de pontos e de tempo que cada equipa realizou e gastou a realizar esses questionários, então criei a seguinte instrução:

    SELECT        Equipa.NomeEquipa, SUM(Pontuacao.Pontuacao) AS Pontuacao, SUM(Pontuacao.Tempo) AS Tempo
    FROM            Pontuacao INNER JOIN
                             Equipa ON Pontuacao.IdEquipa = Equipa.IdEquipa
    GROUP BY Equipa.NomeEquipa

    Mas aparece uma mensagem a dizer: Operand data type time is invalid for sum operator

    O tipo de variavel que uso na tabela da pontuação para o tempo é time(7) pois só quero contar horas ou minutos.

    Qualquer ideia é bem vinda!

    Obrigado desde já.

    segunda-feira, 19 de julho de 2010 20:42

Todas as Respostas

  • Clemente,

    Pelo que percebi, vc não consegue usar a função SUM com um tipo de dado TIME. Imagino que uma solução seja você o tempo inicial e final de cada equipe e utilizar a função DATEDIFF, escolhendo a unidade de medida que você quer, como Horas, Minutos ou Segundos.

    Abaixo um pequeno exemplo de utilização da função DATEDIFF:

    declare
       @time1 time,
       @time2 time
     
    set @time1 = '10:30:00'
    set @time2 = '10:40:10'

    select DATEDIFF(HOUR, @time1, @time2)
    select DATEDIFF(MINUTE, @time1, @time2)
    select DATEDIFF(SECOND, @time1, @time2)

    Att.


    Erickson Ricci - MCP, MCTS, MCTS BI
    segunda-feira, 19 de julho de 2010 21:07
  • Olá Erickson

    de facto o que acontece, é que a tabela Pontos já recebe a diferença entre o tempo inicial do questionário e o tempo final quando a equipa termina, pelo que não tenho como utilizar o o DateDiff na tabela de Pontos, o objectivo era somar o tempo total que a equipa tem na tabela Pontos mais a soma dos respectivos pontos que ganhou nos questionários, pois o resultado final seria uma listagem por ordem de pontos ganhos e com o menor tempo gasto!

    Obrigado pela atenção,

    Clemente

    segunda-feira, 19 de julho de 2010 21:13
  • Ola Clemnente

    se a intencao é somar no caso de datas use o DATEADD

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    segunda-feira, 19 de julho de 2010 22:30
  • Viva Marcelo,

    se bem entendi substituo o SUM pelo DATEADD certo?

    Obrigado pela atenção,

    Clemente Fernandes

    segunda-feira, 19 de julho de 2010 22:55
  • Bem utilizei o DATEADD, mas deu erro na mesma, pois o DATEADD, pede 3 argumentos, um para o tipo de saída nesta caso era o hh para horas, depois utiliza um número que não sei para que serve (coloquei um 1 conforme a ajuda msdn) e por fim o campo com as horas, mas dá erro na execução.

    Não existe por aí um exemplo onde se possa ver na prática como aplicar?

     

    Obrigado,

    Clemente Fernandes

    segunda-feira, 19 de julho de 2010 23:32
  • Clemente,

    Mas qual foi o erro? Você poderia postar a mensagem de erro?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 20 de julho de 2010 00:14
  • Olá Junior,

    o código utilizado foi este:

    SELECT        Equipa.NomeEquipa, SUM(Pontuacao.Pontuacao) AS TotalPontuacao, DATEADD(hh, 1, Pontuacao.Tempo) AS TotalTempo
    FROM            Pontuacao INNER JOIN
                             Equipa ON Pontuacao.IdEquipa = Equipa.IdEquipa
    GROUP BY Equipa.NomeEquipa
    ORDER BY TotalPontuacao DESC, TotalTempo

    O erro é o seguinte:

    Error Source: .Net Sqlclient Data Provider

    Error Message: Column 'Pontuacao.Tempo' is invalid in the select list because it is not contained in either an aggregate funcion or the GROUP BY clause

     

    Obrigado,

    Clemente

    terça-feira, 20 de julho de 2010 00:33
  • Clemente,

    Declare a coluna Pontuacao.Tempo na claúsula Group By!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 20 de julho de 2010 00:43
  • Junior,

    agora funciona, mas não faz a soma das horas, apenas acrescenta uma hora a cada tempo registado no campo tempo e faz a listagem completa com essa hora acrescida, como este exemplo:

     

    Equipa

    Matrecos

    Pontos

    13

    Total Temp

    01:25:00

    Estudantes 12 01:20:00
    Matrecos 11 01:15:00
    Estudantes 10 01:10:00
    Matrecos 10 01:10:00
    Estudantes 10 01:15:00
    terça-feira, 20 de julho de 2010 00:49
  • O objectivo é fazer a soma de todos os pontos e de todos os tempos por equipa!

     

    Obrigado

    terça-feira, 20 de julho de 2010 00:51
  • Clemente,

    Tente utilizar a claúsula Compute ou Compute By!!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 20 de julho de 2010 01:00
  • Desculpe a ignorância Junior, mas substituo pelo DATEADD ou acrescento, e se for para acrescentar onde o coloco?

     

    Obrigado,

    Clemente

     

    terça-feira, 20 de julho de 2010 01:08
  • Clemente,

    Utilize após o Group By, não é necessário realizar tirar o DateAdd.

    Veja este exemplo:

    SELECT CustomerID, OrderDate, SubTotal, TotalDue
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID = 35
    ORDER BY OrderDate
    COMPUTE SUM(SubTotal), SUM(TotalDue);

    Ou então:

    SELECT SalesPersonID, CustomerID, OrderDate, SubTotal, TotalDue
    FROM Sales.SalesOrderHeader
    ORDER BY SalesPersonID, OrderDate
    COMPUTE SUM(SubTotal), SUM(TotalDue) BY SalesPersonID;

    Ou este:

    SELECT Title = CONVERT(char(20), title), type, price, advance
    FROM Titles
    WHERE ytd_sales IS NOT NULL
     AND type LIKE '%cook%'
    ORDER BY type DESC
    COMPUTE AVG(price), SUM(advance) BY type
    COMPUTE SUM(price), SUM(advance)

    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 20 de julho de 2010 20:09
  • Olá Junior,

    tentei fazer assim:

     

    SELECT        Equipa.NomeEquipa, Pontuacao.Pontuacao, Pontuacao.Tempo
    FROM            Equipa INNER JOIN
                             Pontuacao ON Equipa.IdEquipa = Pontuacao.IdEquipa
    ORDER BY Pontuacao.Pontuacao, Pontuacao.Tempo DESC
    COMPUTE   SUM(Pontuacao.Tempo)

     

    Mas dá o seguinte erro: Operand data type time is invalid for sum operator

     

    Obrigado,

    Clemente

    quarta-feira, 21 de julho de 2010 12:57