Inquiridor
Fazer a soma de pontos de várias equipas.

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.NomeEquipaMas 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á.
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 -
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
-
-
-
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
-
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] -
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, TotalTempoO 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
-
-
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 -
-
-
-
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] -
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