2016-04-21 55 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