2012-11-02 6 views
5

Mam następujące zapytanie:Jak obejść błąd przepełnienia arytmetycznego, przekształcając wyrażenie na typ danych 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 

Definicja #Eligible tabeli temp jest

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

Bez względu na to w jakim stanie lub agregacja I ustosunkowania się, zawsze pojawia się następujący błąd: Arithmetic overflow error converting expression to data type int.

Gdzie mogę przejść? Jak mogę to debugować?

EDIT: Przykładowe dane

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

Masz wiele agregacji w tym zapytaniu, który z nich rzuca błąd? Czy możesz zamieścić kilka przykładowych danych? Jaka jest struktura tabeli 'dbo.MachineConfiguration'? – Taryn

+0

@bluefeet Struktura 'MachineConfiguration' jest dokładnie taka sama, jak tabela #Eligible. W rzeczywistości tabela temp jest podzbiorem konfiguracji "MachineConfiguration". – AngryHacker

+0

Jeśli wybierzesz * z cte, przed połączeniami itp. Pojawią się błędy? – Taryn

Odpowiedz

5

Czy próbowałeś rzucając swoje czasy jaguarstartup do bigint w AVG kruszywa jak tak ...

AVG (CAST (mc.JaguarStartupTime AS BIGINT))

To powinno uporządkować przepełnienie arytmetyczne.

Aby obliczyć średnią wartość średnią, serwer musi najpierw zsumować wszystkie wartości początkowe, aby typ danych, na którym się uśredniałeś, był w stanie przechowywać sumę tych wartości, nawet jeśli zwrócona odpowiedź mieści się w zakresie of int

+0

Dzięki, ja też to rozgryzłem. Ale dlaczego muszę to zrobić? Największym 'JaguarStartupTime' może być int. Dlaczego muszę go przekonwertować? – AngryHacker

+0

Dzięki za wyjaśnienie. – AngryHacker

Powiązane problemy