2016-04-21 147 views
0
+----+------+---------------------------------------+ 
| id | dur | workdur        | 
+----+------+---------------------------------------+ 
| 1 | 64 | /home/public/users/james/PB_3594162_0 | 
| 2 | 123 | /home/public/users/john/PB_990-94162_0 | 
| 3 | 13 | /doc/users/jason/PB_0125135   | 
| 4 | 355 | /doc/users/jason/notPB     | 

我可以得到SQL:GROUP BY部分匹配

select workdur from work where workdur like '%PB_%' 

所有PB_的人我怎么能由"%PB_"部分串组,这样我可以得到平均以上的dur选择?

注:在SELECT语句中,ID = 4不会选择

+0

什么类型的DB是什么? – kometen

+0

oracle和为什么-1? – ealeon

+0

编辑你的问题,并显示你想得到的结果。也用你正在使用的数据库标记问题。我的意思是,不选择平均(dur)。 。 。'做你想做的事情? –

回答

1

你可以简单地用你的WHERE条件一起使用聚合,而无需嵌套查询:

select avg(dur) 
from work 
where workdur like '%PB_%' 
1

您可以使用此

select avg(dur) 
from (select dur from work where workdur like '%PB_%'); 

你应该注意一个重要的事情是,在甲骨文(SQL,在一般情况) ,_就像%一个通配符,所以小心你like,因为它等于like '%PB%'

因此,对于你的情况,你应该改变(一d拆除嵌套,根据从@Aleksej建议)

select avg(dur) 
from work 
where workdur like '%PB\_%' escape '\'; 
+0

哦,不需要做群 – ealeon

+0

为什么要嵌套查询? – Aleksej

+0

哦对不起我的坏 –

1

应该这样做:

CREATE TABLE #test 
(
    id INT 
    , dur INT 
    , workdur VARCHAR(100) 
); 

INSERT INTO #test (id, dur, workdur) 
VALUES (1, 64, '/home/public/users/james/PB_3594162_0') 
    , (2, 123, '/home/public/users/john/PB_990-94162_0') 
    , (3, 13, '/doc/users/jason/PB_0125135') 
    , (4, 355, '/doc/users/jason/notPB'); 

SELECT AVG(CAST(dur AS FLOAT)) 
FROM #test 
WHERE workdur LIKE '%PB\_%' ESCAPE '\'; 

我正在将workdur转换为FLOAT,因为它会在逗号后给出值(除非您将它作为FLOAT存储)。

最重要的是,_LIKE中的一个特殊符号,如果您想将其视为下划线,则需要转义。

1

如果你有多个模式搜索,分组确实成为有用的,你可以使用情况:

select 
    avg(dur), 
    (case 
    when workdur like '%PB\_%' then 'PB' 
    when workdur like 'Other Pattern' then 'Other Pattern' 
    else 'Not PB' end 
) as pb 
from work 
group by pb