GROUP BY同一列中的多个值

时间:2014-07-18 00:04:56

标签: sql sql-server tsql

我有这个SQL查询:

select prefix, code, stat, complete, COUNT(*) as Count
from table
group by prefix, code, stat, complete
order by prefix, code, stat, complete

列'前缀'是字母数字值(0-9a-zA-z)。 我想要的是使它如果前缀的值是一个数字,使数字等于0.如果它是一个字母,它将保持其值。我试图在group by子句下面添加以下行:

(case when prefix like '%[0-9]%' then 0 else prefix end)

但是我收到错误“将varchar值'J'转换为数据类型int时转换失败。”。

导致此错误的原因是什么?如何让'prefix'列显示0或字母?

4 个答案:

答案 0 :(得分:7)

case when prefix like '%[0-9]%' then '0' else prefix end

你显然也需要这个作为GROUP BY

中的表达式
select 
    NewPrefix = case when prefix like '%[0-9]%' then '0' else prefix end, 
    code, 
    stat, 
    complete, 
    COUNT(*) as Count
from table
group by 
    case when prefix like '%[0-9]%' then '0' else prefix end, 
    code, stat, complete
order by 
    case when prefix like '%[0-9]%' then '0' else prefix end, 
    code, stat, complete

答案 1 :(得分:1)

试试这个:

select case when prefix not like '%[^0-9]%' then prefix else '0' end as prefix, code, stat, complete, COUNT(*) as Count
from table
group by case when prefix not like '%[^0-9]%' then prefix else '0' end, code, stat, complete
order by prefix, code, stat, complete

Check This. Looks similar "ISNUMERIC()"

答案 2 :(得分:0)

如果前缀可以包含多个字符,那么您可能需要以下内容:

(case when prefix not like '%[^0-9]%' then '0' else prefix end)

或:

(case when isnumeric(prefix) = 1 then '0' else prefix end)

答案 3 :(得分:-1)

我刚刚在工作中做了这样的事情。

select case when isnumeric(prefix) = '1' then '0' else prefix end as BEST_ANSWER
, code
, stat
, complete
, COUNT(*) as Count
from table
group by prefix, code, stat, complete
order by prefix, code, stat, complete

isnumeric是一个TSQL函数,用于测试它是否为有效数字,如果是,则返回1. case语句表示,如果等于1,则将其设为零,否则返回原始值。顺便说一句,一般来说,你想远离'喜欢',因为它对性能不利。