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

Ich kann alle PB_ diejenigen bekommen mitsql: Gruppe von teilweise Übereinstimmung

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

Wie kann ich Gruppe von Teilfolge von "%PB_", so dass ich dur der oben wählen Durchschnitt erhalten kann?

HINWEIS: in der select-Anweisung, id = 4 wont

+0

Welche Art von DB ist es? – kometen

+0

Orakel und warum -1? – ealeon

+0

Bearbeiten Sie Ihre Frage und zeigen Sie die Ergebnisse, die Sie erhalten möchten. Kennzeichnen Sie die Frage auch mit der von Ihnen verwendeten Datenbank. Ich meine, wählt nicht avg (dur). . Mach was du willst? –

Antwort

1

Sie können einfach Aggregation verwenden zusammen mit Ihrer WHERE Bedingung, ohne die Notwendigkeit einer verschachtelten Abfrage:

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

ausgewählt werden Sie diese verwenden können

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

Eine wichtige Sache Sie feststellen sollten, ist, dass in Oracle (SQL, im Allgemeinen) , _ ist ein Platzhalter wie %, also seien Sie vorsichtig mit Ihren like, weil es gleich like '%PB%'

also für Ihren Fall, dass Sie sich ändern sollte (ein d entfernen verschachtelt, nach von @Aleksej vorschlagen)

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

oh keine Notwendigkeit, Gruppe zu tun – ealeon

+0

Warum die verschachtelte Abfrage? – Aleksej

+0

oh Entschuldigung, mein Schlechter –

1

Das sollte es tun:

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 '\'; 

ich workdur als FLOAT Gießen, denn dann wird es Ihnen Werte auch nach dem Komma geben (es sei denn, Sie es als FLOAT speichern sowieso).

Darüber hinaus ist _ ein spezielles Symbol in LIKE und muss maskiert werden, wenn Sie es als Unterstrich behandeln möchten.

1

Wenn Sie mehrere Muster suchen haben, Gruppierung nützlich ist geworden und Sie können Fall verwenden:

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