1

我正在使用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 查询的了解,因此非常感谢您的帮助。一个好的解决方案显然会得到一个复选标记和支持!

4

1 回答 1

2

CASE 语句仅用于一列,它与 IF 语句不太一样。

SELECT  opened As 'Opened',
        closed As 'Closed',
        operator As 'Operator', 
        [rows] As 'Rows', 
        DATEDIFF(MI, opened, closed) As 'Mins',
        CASE    WHEN [Rows] <> 0 
                THEN Convert( decimal(10,1), rows/Cast(DATEDIFF(MI, opened, closed) as decimal))
                ELSE 0
        END as 'Rows/Min'
FROM log
于 2013-07-09T07:59:47.517 回答