Fernandinha Posted March 21, 2012 Report Share Posted March 21, 2012 (edited) Olá pessoal!!Tenho o seguinte select:SELECT DISTINCT Id, TotalHoras = REPLICATE('0',2-LEN(HrRealizadas))+ CAST((SUM(HrRealizadas) % 60) AS VARCHAR(2)) + ':' + REPLICATE('0',2-LEN(MinRealizados))+ CAST((SUM(MinRealizados) % 60) AS VARCHAR(2))/*(sum(HrRealizadas)+sum(MinRealizados/60))*/ FROM FREQUENCIAWHERE Id = 5GROUP BY Id, HrRealizadas, MinRealizadosEle está me retornando:Id TotalHoras11195 04:4511195 36:00Porém gostaria que ele me retornasse isso:Id TotalHoras11195 40:45Alguém pode me dar um help, por favor?Obrigada. Edited March 22, 2012 by Fernandinha Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted March 21, 2012 Report Share Posted March 21, 2012 Bom dia Fernandinha, Olha se assim roda:SELECT Id, TotalHoras = REPLICATE('0',2-LEN(HrRealizadas))+ CAST((SUM(HrRealizadas) % 60) AS VARCHAR(2)) + ':' + REPLICATE('0',2-LEN(MinRealizados))+ CAST((SUM(MinRealizados) % 60) AS VARCHAR(2))/*(sum(HrRealizadas)+sum(MinRealizados/60))*/ FROM FREQUENCIA WHERE Id = 5 GROUP BY Id Quote Link to comment Share on other sites More sharing options...
0 Fernandinha Posted March 22, 2012 Author Report Share Posted March 22, 2012 Bom dia Fulvio!Então, dessa forma eu já havia tentado, mas dá o seguinte erro:Msg 8120, Level 16, State 1, Line 2Column 'FREQUENCIA.HrRealizadas' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.Msg 8120, Level 16, State 1, Line 2Column 'FREQUENCIA.MinRealizados' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted March 22, 2012 Report Share Posted March 22, 2012 Bom dia Fernandinha, O erro ocorre por causa do replicate. Que tipo de dado é manipulado nos campos HrRealizadas e MinRealizados? Quote Link to comment Share on other sites More sharing options...
0 Fernandinha Posted March 22, 2012 Author Report Share Posted March 22, 2012 Olá!São campos do tipo SMALLINT.Teria algum outro meio de eu unir esses dois campos no formato de horas? HH:MMObrigada. Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted March 22, 2012 Report Share Posted March 22, 2012 Estava perguntando o tipo por que se conseguir substituir o replicate por outra função do sql com SUM, MAX, MIN, etc (ou até mesmo uma conversão), conseguirá realizar o total sem a necessidade de especificar os campos no group by. você utilizando o replicate, há a possibilidade de sua concatenação retornar mais de 1 linha de dados. Desta forma o sql necessita a especificação da coluna no agrupamento. Não tenho como postar um script pois não tenho exemplo dos dados manipulados.... caso queira postar... Quote Link to comment Share on other sites More sharing options...
0 Fernandinha Posted March 22, 2012 Author Report Share Posted March 22, 2012 As colunas da tabela que eu estou utilizando são essas:IdTurma HrRealizadas MinRealizados11195 12 011195 12 011195 12 011195 4 4511201 5 0 Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted March 22, 2012 Report Share Posted March 22, 2012 Segue exemplo:CREATE TABLE #tabela (IdTurma INT, HrRealizadas INT, MinRealizados INT) INSERT INTO #tabela VALUES (11195, 12, 0) INSERT INTO #tabela VALUES (11195, 12, 0) INSERT INTO #tabela VALUES (11195, 12, 0) INSERT INTO #tabela VALUES (11195, 4, 45) INSERT INTO #tabela VALUES (11201, 5, 0) SELECT IdTurma, Total=CAST(SUM(HrRealizadas)AS VARCHAR)+':'+cast(SUM(MinRealizados) AS VARCHAR) FROM #tabela GROUP BY IdTurma Quote Link to comment Share on other sites More sharing options...
0 Fernandinha Posted March 22, 2012 Author Report Share Posted March 22, 2012 Então Fulvio, dessa forma os resultados ficam assim:IdTurma Total11195 40:4511201 5:0Precisaria que eles retornassem assim:IdTurma Total11195 40:4511201 05:00Não sei se no lugar do replicate posso utilizar outra função.Obrigada! Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted March 22, 2012 Report Share Posted March 22, 2012 Ahm.... rs.... agora entendi!!! Para estas situações, prefiro o case. Apesar da estrutura ficar maior, acho que fica mais legível. Segue script:CREATE TABLE #tabela (IdTurma INT, HrRealizadas INT, MinRealizados INT) INSERT INTO #tabela VALUES (11195, 12, 0) INSERT INTO #tabela VALUES (11195, 12, 0) INSERT INTO #tabela VALUES (11195, 12, 0) INSERT INTO #tabela VALUES (11195, 4, 45) INSERT INTO #tabela VALUES (11201, 5, 0) SELECT IdTurma, CASE len(CAST(SUM(HrRealizadas)AS VARCHAR)) WHEN 1 THEN '0' + CAST(SUM(HrRealizadas)AS VARCHAR) ELSE CAST(SUM(HrRealizadas)AS VARCHAR) END + ':' + CASE len(cast(SUM(MinRealizados) AS VARCHAR)) WHEN 1 THEN '0' + cast(SUM(MinRealizados) AS VARCHAR) ELSE cast(SUM(MinRealizados) AS VARCHAR) end AS Total FROM #tabela GROUP BY IdTurma Quote Link to comment Share on other sites More sharing options...
0 Fernandinha Posted March 22, 2012 Author Report Share Posted March 22, 2012 Muito obrigada Fulvio!!! =) Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted March 22, 2012 Report Share Posted March 22, 2012 De nada... precisando estamos ai!! :) Quote Link to comment Share on other sites More sharing options...
Question
Fernandinha
Olá pessoal!!
Tenho o seguinte select:
SELECT DISTINCT
Id,
TotalHoras = REPLICATE('0',2-LEN(HrRealizadas))+ CAST((SUM(HrRealizadas) % 60) AS VARCHAR(2)) + ':' + REPLICATE('0',2-LEN(MinRealizados))+ CAST((SUM(MinRealizados) % 60) AS VARCHAR(2))/*(sum(HrRealizadas)+sum(MinRealizados/60))*/
FROM FREQUENCIA
WHERE Id = 5
GROUP BY Id, HrRealizadas, MinRealizados
Ele está me retornando:
Id TotalHoras
11195 04:45
11195 36:00
Porém gostaria que ele me retornasse isso:
Id TotalHoras
11195 40:45
Alguém pode me dar um help, por favor?
Obrigada.
Edited by FernandinhaLink to comment
Share on other sites
11 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.