【问题标题】:How to use Count with Case When?如何在大小写时使用计数?
【发布时间】:2019-04-29 16:21:35
【问题描述】:

我正在尝试查询以获取两个日期之间的环境。

如果表中有超过 1 个值:显示错误'否则显示 Env 的值。

我不确定我的查询是否正确。

SELECT ENV,
Case count(Env)
when 1 then Env
else 'ERROR'

From EnvTable
Inner JOIN USER ON USR_ID=Env_Usr_ID
where Usr_login='ELLA' and Env_Date between 201601 and 201612
Group by Env

我排除 Env,但实际结果是消息错误: 将数据类型 varchar 转换为数字时出错

【问题讨论】:

    标签: sql-server count case case-when


    【解决方案1】:

    case 的所有分支必须返回相同的数据类型。例如,要让所有分支都返回 varchar(max)

    case count(Env)
    when 1 then cast(env as varchar(max))
    else 'ERROR'
    end
    

    【讨论】:

    • 使用 varchar(max) 太过分了。使用较短的长度。我相信最长的数值应该适合 varchar(40)
    • 感谢您的留言。不幸的是,我得到 2 列 2 值 500 和 600(这不是我查询的目的),第二列显示消息“错误”。
    • @LuisCazares: varchar(max) 使用字符串长度加上 2 个字节 (msdn) 没有理由再猜测最大值了。
    • 如果您知道要转换的列的数据类型,就不应该有任何猜测。该文档还指出,只有在长度超过 8000 字节时才应使用 MAX,这不会发生在任何数值上。
    • 来自msdn:每个非空 varchar(max) 或 nvarchar(max) 列都需要 24 字节的额外固定分配,这在排序操作期间不计入 8,060 字节的行限制。
    【解决方案2】:

    希望以下脚本提示能帮助您解决问题。如果我从表“EnvTable”和“用户”中获取您的实际数据样本,然后我可以提供实际脚本。

    SELECT 
    E.ENV,
    CASE COUNT(E.Env)
        WHEN 1 THEN CAST(E.Env AS VARCHAR(50))
        ELSE 'ERROR'
    END AS ENV_COUNT
    FROM EnvTable E
    INNER JOIN [USER] U 
        ON U.USR_ID=E.Env_Usr_ID
    WHERE U.Usr_login='ELLA' 
    AND E.Env_Date BETWEEN '201601' AND '201612'
    GROUP BY E.Env
    

    【讨论】:

    • 实际上,给了我 2 个值。我想要一个价值,这就是目的。如果有 2 个值,则错误消息应显示,但现在并非如此。感谢您的帮助
    • 在我的查询输出中,如果“EnvTable”表有超过 1 条记录属于给定日期范围内“ELLA”的相同“env”,则显示该“env”的消息“ERROR”价值。其他情况下,它直接显示“E.Env”列中的值。如果我对要求的理解有误,请您解释一下。
    • 没错,但我不明白为什么我会在表中得到 2 条记录和带有错误消息的列。
    • 您能否提供一些表“EnvTable”和“USER”中的示例数据以及您的预期输出?这将有助于更多地找到解决方案。
    • 您好,我尝试了另一种方法,我得到了结果,但是消息错误“子查询返回了多个值。当子查询遵循 =,!=, 时,这是不允许的,>= 或当子查询用作表达式时。
    猜你喜欢
    • 2021-02-07
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2019-08-22
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多