2013-04-03 89 views
0

下面是我未檢查錯誤值的現有SQL代碼(sql server)。如果月份和年份值匹配,它只是計算總和列和平均值列。如何修改我的代碼,以設置sum/avg爲負數,如果任何一個值爲負數

SELECT ur.Domain, SUM(ur.DataUsageInBytes) as SumDataUsageInBytes, 
     AVG(ur.DiskUsageInBytes) as AvgDiskUsageInBytes 
FROM UsageResults ur 
WHERE (ur.Year = @year) AND (ur.Month = @month) 
GROUP BY [Domain] 

我要添加邏輯,如果任何ur.DataUsageInBytes值(給定的月/年)爲負我想設置的和說的-99,否則我就計算正常總和。平均值也是一樣。

如果遇到錯誤並且無法確定其值,則正在讀取的表條目將具有負值。

+1

怎麼可能'DataUsageInBytes'永遠是負面的?當然它只能是0或更多?磁盤使用情況也一樣? – Oded 2013-04-03 18:47:57

+0

@Oded Op表示如果出現錯誤並且實際值無法確定,那麼這些列將具有負數 – Lamak 2013-04-03 18:49:40

+3

當Min(ur.DataUsageInBytes)<0時的情況下,則爲-99 else Sum(ur.DataUsageInBytes )結束? – HABO 2013-04-03 18:50:04

回答

3
SELECT ur.Domain 
,  case 
     when min(ur.DataUsageInBytes) < 0 then -99 
     else sum(ur.DataUsageInBytes) 
     end as SumDataUsageInBytes 
,  case 
     when min(ur.DataUsageInBytes) < 0 then -99 
     else avg(ur.DataUsageInBytes) 
     end as AvgDiskUsageInBytes 
FROM UsageResults ur 
WHERE ur.Year = @year AND ur.Month = @month 
GROUP BY 
     ur.Domain 
+0

非常感謝你! – FrodoFraggins 2013-04-03 18:58:08

0

你可以把每個值成正和比較總和

SELECT ur.Domain 
, CASE WHEN SUM(ur.DataUsageInBytes) = SUM(ABS(ur.DataUsageInBytes)) THEN SUM(ur.DataUsageInBytes) ELSE -99 END as SumDataUsageInBytes 
, CASE WHEN min(ur.DiskUsageInByters) < 0 THEN -99 ELSE AVG(ur.DiskUsageInBytes) END AS AvgDiskUsageInBytes 
FROM UsageResults ur 
WHERE (ur.Year = @year) AND (ur.Month = @month) 
GROUP BY [Domain] 
+0

有趣的方法 – FrodoFraggins 2013-04-03 18:58:41

+0

@FrodoFraggins使用分鐘大概是快,但不能肯定是否區別是明顯的 – 2013-04-03 19:09:46

相關問題