【问题标题】:IsNumeric and Case-when to count numeric values and change how it's displayed in resultsIsNumeric 和 Case-when 计算数值并更改其在结果中的显示方式
【发布时间】:2018-09-21 19:50:50
【问题描述】:

我正在尝试从客户通过电话回答的调查中提取计数。该调查有 3 个问题,答案有时是数字,有时是单词。我想计算答案,但需要计算任何数值并将其显示为 NUMERIC_ENTRY。我一直在尝试“IsNumeric”和“Case when”,但结果不正确。

样本数据:

Question | Answer  
Q1       | 12  
Q1       | 456  
Q1       | 8  
Q1       | DontKnow  
Q1       | TellMeHow  
Q2       | Yes  
Q3       | No

示例结果:

Question | Asnwer          | Count  
Q1       |  NUMERIC_ENTRY  | 3  
Q1       | DontKnow        | 1  
Q1       | TellMeHow       | 1  
Q2       | Yes             | 1  
Q3       | No              | 1  

示例 SQL:

select Question, Answer, count (*) from Survey
where Client = 'ABC_Company'   
group by Question, Answer

【问题讨论】:

  • 您好,欢迎来到 SO。在我们继续之前,您需要确定您使用的是哪个 DBMS。 mysql sql 服务器。然后随意为您正在使用的 DBMS 添加数据库特定标签。

标签: sql case-when isnumeric


【解决方案1】:

对于 MySQL: 借鉴https://stackoverflow.com/a/5065007/2469308 的想法,您可以使用If() 函数检查字符串是否为数字。

尝试以下查询:

select Question, 
       IF(CONCAT('',Answer * 1) = Answer, 'NUMERIC_ENTRY', Answer) AS Ans, 
       COUNT(*)
FROM Survey
where Client = 'ABC_Company'   
GROUP BY Question, Ans 

【讨论】:

    【解决方案2】:

    您可以使用LIKE 和一个匹配任何非数字字符的模式。

    SELECT question,
           CASE
             WHEN answer = ''
                   OR answer LIKE '%[^0-9]%'
               answer
             ELSE
               'NUMERIC_ENTRY'
           END answer,
           count(*)
           FROM survey
           WHERE client = 'ABC_Company'   
           GROUP BY question,
                    CASE
                      WHEN answer = ''
                            OR answer LIKE '%[^0-9]%'
                        answer
                      ELSE
                        'NUMERIC_ENTRY'
                    END;
    

    (假设 SQL Server 因为isnumeric()(你也可以使用它,但众所周知它有时会产生有趣的结果,我宁愿选择LIKE)。)

    自 SQL Server 2012 以来的另一个选项是使用try_cast(),检查字符串是否可以转换为整数。

    SELECT question,
           CASE
             WHEN answer = ''
                   OR try_cast(answer AS integer) IS NULL
               answer
             ELSE
               'NUMERIC_ENTRY'
           END answer,
           count(*)
           FROM survey
           WHERE client = 'ABC_Company'   
           GROUP BY question,
                    CASE
                      WHEN answer = ''
                            OR try_cast(answer AS integer) IS NULL
                        answer
                      ELSE
                        'NUMERIC_ENTRY'
                    END;
    

    【讨论】:

      【解决方案3】:

      不要使用isnumeric()。您会对一些被认为是数字的事物感到惊讶(例如'$'',''3e2')。

      所以,like 在这种情况下是你的朋友。 numeric,我假设你的意思是所有数字。因为要按结果进行聚合,所以需要两次引用该列。所以,我要建议apply

      select s.question, v.answer_group, count(*)
      from survey s cross apply
           (values (case when s.answer like '%[^0-9]%' then s.answer  -- has non-digit
                         else 'NUMERIC_ENTRY'
                    end)
           ) v(answer_group)
      group by s.question, v.answer_group
      order by s.question, count(*) desc, v.answer_group;
      

      请注意,这会将空字符串视为数字。这很容易调整;您的问题不清楚在这种情况下该怎么做。我可能会建议:

           (values (case when ltrim(rtrim(s.answer)) = '' or s.answer is null then 'BLANK_ENTRY'
                         when s.answer like '%[^0-9]%' then s.answer  -- has non-digit
                         else 'NUMERIC_ENTRY'
                    end)
           ) v(answer_group)
      

      【讨论】:

      • 我很惊讶 isumeric() 将 '$' 视为数字,我经常使用 isumeric() 并且从未注意到任何奇怪的行为,它总是按预期行事。
      • @Markov 。 . .我会让你运行示例。
      【解决方案4】:

      如果您的版本是SQL Server 2012 或更高版本,则使用TRY_PARSE 函数@Gordon 是正确的,使用ISNUMERIC 函数可能会出现问题,如下面的演示链接中所示 ):

      select q.Question, q.AnswerCount, count(q.AnswerCount) as count
        from
      (
      select Question, 
             (case when TRY_PARSE(Answer as int) is not null then 'NUMERIC_ENTRY'
                  else Answer end) as AnswerCount
        from Survey   
       where Client = 'ABC_Company'   
       group by Question, Answer
      ) as q
      group by q.Question, q.AnswerCount
      order by q.Question, count desc
      

      Rextester Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        相关资源
        最近更新 更多