【问题标题】:Trouble with a select case statement, need to avoid division by 0select case语句有问题,需要避免除以0
【发布时间】:2013-07-09 07:51:05
【问题描述】:

我正在使用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.
我曾尝试使用查询设计器,但我认为我的情况太复杂了,或者我没有正确探索查询设计器的可能性。无论如何,我认为解决方法是Mins 列中的任何数据库条目(行)等于0 时省略计算。我尝试添加 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 查询的了解,因此非常感谢您的帮助。一个好的解决方案显然会得到一个复选标记和支持!

【问题讨论】:

    标签: sql tsql select case


    【解决方案1】:

    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
    

    【讨论】:

    • 现在确实很有意义。非常感谢您指出。 +1 干得好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多