【问题标题】:CONVERT clause in CASE statementCASE 语句中的 CONVERT 子句
【发布时间】:2014-08-13 00:25:27
【问题描述】:

这个查询:

SELECT 
   COUNT (a.clientid) AS NumChild
   ,sub.eligtype 
FROM 
    (SELECT 
        CASE 
            WHEN eligibilitytyperecalc IN ('1', '4', '5', '7') THEN 'EstCondition' 
            WHEN eligibilitytyperecalc IN ('2', '6') THEN 'EstDelay' 
            WHEN eligibilitytyperecalc IN ('3', '8') THEN 'AtRisk' 
            ELSE 'Missing' 
        END AS EligType 
    FROM       
        ei_archive..closed_fy13_clientstatus13) AS sub 
INNER JOIN 
   ei_archive..closed_fy13_clientstatus13 a ON sub.eligtype = a.eligibilitytyperecalc
WHERE      
   fy13_finalclientstatus = 14
   AND programid <>40
   AND programid = 01
GROUP BY   
   sub.eligtype 

返回错误:

消息 245,第 16 级,状态 1,第 1 行
将 varchar 值“AtRisk”转换为数据类型 smallint 时转换失败。

我了解问题(不同的数据类型),但无法确定将 CONVERT 子句放在何处。我已经在第一个 select 语句、CASE 语句和 GROUP BY 中尝试过。

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案1】:

    您正在尝试将值'AtRisk' 转换为不可能的数值。您可以在子查询中包含数字字段并加入:

    SELECT COUNT (a.clientid) AS NumChild
        , sub.eligtype 
    FROM 
        (SELECT 
            eligibilitytyperecalc ,   // include key value
            CASE 
                WHEN eligibilitytyperecalc IN ('1', '4', '5', '7') THEN 'EstCondition' 
                WHEN eligibilitytyperecalc IN ('2', '6') THEN 'EstDelay' 
                WHEN eligibilitytyperecalc IN ('3', '8') THEN 'AtRisk' 
                ELSE 'Missing' 
            END AS EligType 
        FROM ei_archive..closed_fy13_clientstatus13) AS sub 
    INNER JOIN ei_archive..closed_fy13_clientstatus13 a 
        ON sub.eligibilitytyperecalc = a.eligibilitytyperecalc // join on key field
    WHERE  fy13_finalclientstatus = 14
        AND programid <>40
        AND programid = 01
    GROUP  BY sub.eligtype 
    

    【讨论】:

      【解决方案2】:

      我相信表 ei_archive..closed_fy13_clientstatus13 的字段资格类型重新计算是一个整数,因此将您的 a.eligibilitytyperecalc 转换为 char/varchar,因为您将它与字符串进行比较(ON sub.eligtype = a.eligibilitytyperecalc)。试试下面的代码

      SELECT 
      COUNT (a.clientid) AS NumChild
      ,sub.eligtype 
      FROM 
      (SELECT 
          CASE 
              WHEN eligibilitytyperecalc IN ('1', '4', '5', '7') THEN 'EstCondition' 
              WHEN eligibilitytyperecalc IN ('2', '6') THEN 'EstDelay' 
              WHEN eligibilitytyperecalc IN ('3', '8') THEN 'AtRisk' 
              ELSE 'Missing' 
          END AS EligType 
      FROM       
          ei_archive..closed_fy13_clientstatus13) AS sub 
      INNER JOIN 
      ei_archive..closed_fy13_clientstatus13 a ON sub.eligtype = cast(a.eligibilitytyperecalc        as char(10))
      WHERE      
       fy13_finalclientstatus = 14
      AND programid <>40
      AND programid = 01
      GROUP BY   
      sub.eligtype 
      

      【讨论】:

      • 是一个整数;但是,当我运行代码时,它返回了列名但没有计数。
      猜你喜欢
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多