2013-08-14 15 views
7

Sto affrontando un problema nel trovare la somma dei valori memorizzati in una colonna SQL,Come ottenere somma del campo di volta in assistente 2008

Ho una tabella come questa:

gs_cycle_no | from_time | to_time | total_hours(varchar) ... 
GSC-334/2012 | 13:00  | 7:00  | 42:00 
GSC-334/2012 | 8:30  | 3:45  | 6:00 
. 
. 
. 

What i è necessario trovare il gruppo Sum(total_hours) entro il gs_cycle_no. Ma il metodo Sum non funziona sulla colonna varchar e anche i cant convertirlo in decimale grazie al suo formato,

come posso trovare la sum di total_hours colonna, sulla base di gs_cycle_no?

+1

cosa rappresenta il valore '42: 00'? 42 ore e 0 minuti? – GolfWolf

risposta

5

se non si hanno minuti e solo poche ore, allora si può fare qualcosa di simile:

select 
    cast(sum(cast(replace(total_hours, ':', '') as int)/100) as nvarchar(max)) + ':00' 
from Table1 
group by gs_cycle_no 

se non, provate questo:

with cte as 
(
    select 
     gs_cycle_no, 
     sum(cast(left(total_hours, len(total_hours) - 3) as int)) as h, 
     sum(cast(right(total_hours, 2) as int)) as m 
    from Table1 
    group by gs_cycle_no 
) 
select 
    gs_cycle_no, 
    cast(h + m/60 as nvarchar(max)) + ':' + 
    right('00' + cast(m % 60 as nvarchar(max)), 2) 
from cte 

sql fiddle demo

+0

primo lavoro solo per ore intere come scritto, gruppo perso per secondo in secondo, grazie per quello –

+0

72:25 - vedi http://sqlfiddle.com/#!3/b81ab/1 –

+0

@OzrenTkalcecKrznaric come hai fatto a testarlo? :) –

0

Questa interrogazione trova la somma in minuti:

SQLFiddle demo

select gs_cycle_no, 

    SUM(
    CAST(
    ISNULL(
    substring(total_hours,1,CHARINDEX(':',total_hours)-1) 
    ,'0') as INT) * 60 
    + 
    CAST(
    ISNULL(
    substring(total_hours,CHARINDEX(':',total_hours)+1,100) 
    ,'0') as INT) 
    ) 
    from t 
group by gs_cycle_no 
+0

Resultset genera minuti, anziché ore – OzrenTkalcecKrznaric

0

Ecco soluzione in cui mi rompo varchar in due piccoli pezzi, ore e minuti, e poi fare minuti da loro, e alla fine, li Somma:

SELECT 
    gs_cycle_no, 
    CAST(SUM(
     SUBSTRING(total_hours,0 ,CHARINDEX(':', total_hours)) * 60 + 
     SUBSTRING(total_hours, CHARINDEX(':', total_hours) + 1, LEN(total_hours)))/60 AS VARCHAR) + ':' + 
    CAST(SUM(
     SUBSTRING(total_hours,0 ,CHARINDEX(':', total_hours)) * 60 + 
     SUBSTRING(total_hours, CHARINDEX(':', total_hours) + 1, LEN(total_hours))) % 60 AS VARCHAR) 
FROM Table1 
GROUP BY gs_cycle_no 
1

questo funzionerà:

;with times as (
    select gs_cycle_no = 'GSC-334/2012', total_hours = '8:35' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '5:00' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '16:50' 
    union all SELECT gs_cycle_no = 'GSC-334/2012', '42:00' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '0:00' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '175:52' 
    union all SELECT gs_cycle_no = 'GSC-335/2012', '12:25') 
SELECT 
    gs_cycle_no, 
    hrs = sum(mins)/60 + sum(hrs), 
    mins = sum(mins) % 60 
FROM 
    TIMES 
    cross apply(
     select c = charindex(':', total_hours) 
    ) idx 
    cross apply(
     select 
      hrs = cast(substring(total_hours, 1, c - 1) as int), 
      mins = cast(substring(total_hours, c + 1, len(total_hours)) as int) 
    ) ext 
group by gs_cycle_no 
order by gs_cycle_no 
Problemi correlati