2010-07-21 21 views
10

Używam Oracle SQL i chcę zgrupować kilka różnych wierszy, które dają wyniki funkcji "Lubię to". Opracowanie na przykładzie:SQL: Czy można "grupować według" według wyników funkcji "podobnych"?


Załóżmy Mam tabeli MESA z jednej z kolumn jest ogromny ciąg. I liczę liczbę wierszy spełniających szczególne wzory:

SELECT m.str, count(*) 
FROM MESA m 
WHERE m.str LIKE '%FRUIT%' 
AND (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%') 

Więc załóżmy, wynikiem tego zapytania jest:

FRUIT..afsafafasfa ... RED_APPLE 20

OWOCE ..afsafafasfa ... YELLOW_APPLE 12

FRUIT..afsafafasfa ... GREEN_APPLE 3

FRUIT..afsafafasfa ... PURPLE_ORANGE 4

FRUIT..afsafafasfa ... RED_ORANGE 45

Ale ja chcę moje wyniki będą:

APPLE 35

ORANGE 49


Czy można to zrobić? Jeśli tak, to w jaki sposób? :)

Komentarze i fragmenty kodu są mile widziane.

PS: Oczywiście zapytanie i wyniki są bardziej skomplikowane niż powyższy przykład. Po prostu napisałem to dla uproszczenia wyjaśnienia.

Cheers ..

+2

Co powiesz na takie napisy: "FRUIT..afsafafasfa ... ORANGE_APPLE"?;) – ThinkJet

+0

Tak, to dobra uwaga. W moim przypadku nie ma takich znaków. Chyba zależy to od kolejności spraw. – someone

Odpowiedz

11

Sure:

WITH Fruits AS (
    SELECT 
     CASE 
      WHEN m.str LIKE '%APPLE%' THEN 'Apple' 
      WHEN m.str LIKE '%ORANGE%' THEN 'Orange' 
     END AS FruitType   
    FROM MESA m 
    WHERE m.str LIKE '%FRUIT%') 
SELECT FruitType, COUNT(*) 
FROM Fruits 
WHERE FruitType IN ('Apple', 'Orange') 
GROUP BY FruitType; 
+1

OK, działa, +1 – ThinkJet

+0

Dzięki Dave. Uwielbiam to z thingie:) – someone

0
SELECT count(*) AS 'Apples' 
FROM MESA m 
WHERE m.str LIKE '%FRUIT%' 
AND m.str LIKE '%APPLE%' 

SELECT count(*) AS 'Oranges' 
FROM MESA m 
WHERE m.str LIKE '%FRUIT%' 
AND m.str LIKE '%ORANGE%' 

Czy to działa?

+0

Dzięki za odpowiedź JNKyle. Myślałem o tym, ale odpowiedź Dave'a jest bardziej odpowiednia dla mojej sprawy (ponieważ mam dużo grup do zrobienia) – someone

0

coś takiego?

SELECT Fruit, 
     SUM(counter) 
FROM (SELECT CASE 
        WHEN m.str LIKE '%APPLE%' 
         THEN 'APPLE' 
        ELSE 'ORANGE' 
       END AS Fruit 
       COUNT(*) AS counter 
      FROM MESA m 
     WHERE m.str LIKE '%FRUIT%' 
      AND (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%') 
     GROUP BY m.str 
    ) 
GROUP BY Fruit 
+0

nie można użyć count (*) bez klauzuli grupowania ... (spójrz na wybór wewnętrzny) – ThinkJet

+0

Dzięki za odpowiedź Mark. – someone

+0

@ ThinkJet- Przykro nam, myślałem, że mam GROUP BY w wewnętrznej SELECT –

2

Inny wariant David Markle odpowiedź:

SELECT 
    fruit_name, 
    count(1) as fruit_count 
FROM (
    SELECT 
    CASE 
     WHEN m.str LIKE '%APPLE%' THEN 'Apple' 
     WHEN m.str LIKE '%ORANGE%' THEN 'Orange' 
    END           as fruit_name 
    FROM 
    MESA m 
    WHERE 
    m.str LIKE '%FRUIT%' 
    AND 
    (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%') 
) 
GROUP BY 
    fruit_name 

samo, ale tylko 1 przypadek wymaga, co upraszcza obsługę ...

+0

Dzięki za odpowiedź ThinkJet. Bardzo doceniane. – someone

0

chciałbym zrobić to w ten sposób - wymaga tylko pojedyncza zmiana w celu dodania dodatkowych rodzajów owoców.

WITH fruits AS (
    SELECT 'APPLE' fruit FROM DUAL 
    UNION ALL 
    SELECT 'ORANGE' fruit FROM DUAL 
) 
SELECT fruit, count(*) 
FROM MESA m, fruits 
WHERE m.str LIKE '%FRUIT%' 
AND m.str LIKE '%' || fruits.fruit || '%' 
GROUP BY fruit 

Jeśli ciągi są niezawodnie w formacie pokazałeś w danych przykładowych, chciałbym rozważyć zmianę predykat do jednego warunku, WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'.

Powiązane problemy