2013-04-03 97 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

相关问题