我正在使用Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (64-bit)
我有一个表格,用于跟踪在 excel 文件的会话期间修改的所有用户、时间和行。我的表(名为: log)最初看起来像这样:
Opened Closed Operator Rows Mins
2013-06-26 11:53:58.000 2013-06-26 13:00:55.000 excel-user 225 67
2013-06-26 13:36:32.000 2013-06-26 15:58:25.000 excel-user 473 142
2013-06-26 16:17:34.000 2013-06-26 17:03:08.000 excel-user 181 46
我写了一个简单的查询来计算Rows per Minute
。这是我完成这项工作的查询:
Select opened As 'Opened',
closed As 'Closed',
operator As 'Operator',
rows As 'Rows',
DATEDIFF(MI, opened, closed) As 'Mins',
Convert( decimal(10,1), rows/Cast(DATEDIFF(MI, opened, closed) as decimal)) as 'Rows/Min'
from log
如果有人打开文件不到一分钟,就会出现问题。然后分钟数等于 0,因此我当前的查询失败并给出divide by 0
错误
Divide by zero error encountered.
我尝试使用查询设计器,但我认为我的情况对它来说太复杂了,或者我没有正确探索查询设计器的可能性。无论如何,我认为解决方法是在列中的任何数据库条目(行)等于 0时省略计算Mins
。我尝试添加一个where mins <> 0
运算符,但是它只是跳过行并显示不完整的结果 => 这不是我在找什么。我已经查看了 SO 和 uncle google 但是我仍然无法解决这个问题。我想我知道我不能在我的案例中应用它。在 C# 或 VB 中使用这种简单的语句我不会有任何问题,但是 SQL 不是我的强项,所以我需要你的帮助。
我试过这个查询
SELECT CASE
WHEN rows <> 0
THEN
(
SELECT
opened As 'Opened',
closed As 'Closed',
operator As 'Operator',
rows As 'Rows',
DATEDIFF(MI, opened, closed) As 'Mins',
Convert( decimal(10,1), rows/Cast(DATEDIFF(MI, opened, closed)as decimal)) as 'Rows/Min'
)
ELSE
(
SELECT
opened As 'Opened',
closed As 'Closed',
operator As 'Operator',
rows As 'Rows',
DATEDIFF(MI, opened, closed) As 'Mins',
'0' as 'Rows/Min'
)
END
FROM log
但它给了我这个错误消息
当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。
我认为这超出了我目前对 SQL 查询的了解,因此非常感谢您的帮助。一个好的解决方案显然会得到一个复选标记和支持!