2012-11-02 15 views
5

Ho la seguente query:Come aggirare l'errore di overflow aritmetico convertendo l'espressione in tipo di dati int?

-- CTE to remove outliers, e.g. remove the fastest and slowest results 
;WITH MinMaxCTE AS 
(
    SELECT ServerName, CONVERT(VARCHAR(10), UpdatedOn, 101) AS [Date], Version, 
    MIN(JaguarStartupTime) AS MinStartTime, MAX(JaguarStartupTime) AS MaxStartTime 
    FROM dbo.MachineConfiguration (NOLOCK) 
    WHERE DomainLogin NOT IN (SELECT DomainLogin FROM dbo.SupportGroup) 
    GROUP BY ServerName, CONVERT(VARCHAR(10), UpdatedOn, 101), Version 
) 

SELECT AVG(mc.JaguarStartupTime) AS AverageTime 
    , COUNT(*) AS NumEntries 
    , mc.Version 
FROM #Eligible mc (NOLOCK) 
JOIN MinMaxCTE cte ON mc.ServerName = cte.ServerName 
    AND CONVERT(VARCHAR(10), mc.UpdatedOn, 101) = cte.[Date] 
    AND mc.Version = cte.Version 
    AND mc.JaguarStartupTime <> cte.MinStartTime 
    AND mc.JaguarStartupTime <> cte.MaxStartTime 
GROUP BY mc.Version 
ORDER BY Version DESC, AVG(mc.JaguarStartupTime) ASC 

La definizione della tabella temporanea #Eligible è

create table #Eligible (
    Version nvarchar(50), JaguarStartupTime int, 
    ServerName nvarchar(50), UpdatedOn datetime) 

Non importa quale condizione o aggregazione io commento, ho sempre ottenere il seguente errore: Arithmetic overflow error converting expression to data type int.

Dove posso andare da qui? Come faccio a eseguire il debug di questo ulteriore?

EDIT: i dati del campione

Version JaguarStartupTime ServerName  UpdatedOn 
6.4.6.082  16040   NewOrleansLA 2012-08-08 12:34:12.330 
6.5.1.012  40390   BatonRougeLA 2012-08-08 18:33:17.440 
6.5.1.012  48379   HonoluluHI  2012-08-09 04:42:50.453 
+1

Hai più aggregazioni in questa query, quale sta lanciando l'errore? Puoi pubblicare alcuni dati di esempio? Qual è la struttura della tabella di 'dbo.MachineConfiguration'? – Taryn

+0

@bluefeet La struttura di 'MachineConfiguration' è esattamente la stessa di #Tabella temporanea ammissibile. In effetti, la tabella temporanea è un sottoinsieme di 'MachineConfiguration'. – AngryHacker

+0

Se si seleziona * dal cte, prima dei join, ecc. Si verificano errori? – Taryn

risposta

5

Hai provato gettando i tempi jaguarstartup ad un bigint in aggregata avg in questo modo ...

AVG (CAST (mc.JaguarStartupTime AS BIGINT))

Questo dovrebbe risolvere l'overflow aritmetico.

Per calcolare la media significa che il server deve essere in grado di sommare tutti gli interi, quindi il tipo di dati su cui si sta facendo la media deve essere in grado di memorizzare la somma di tali valori, anche se la risposta restituita è compresa nell'intervallo di un numero

+0

Grazie, l'ho capito anch'io. Ma perché ho bisogno di farlo? Il più grande 'JaguarStartupTime' può essere è int. Perché devo convertirlo? – AngryHacker

+0

Grazie per la spiegazione. – AngryHacker

Problemi correlati