2010-07-21 15 views
10

Sto utilizzando Oracle SQL e desidero raggruppare alcune righe diverse con risultati di funzione "mi piace". Elaborare con un esempio:SQL: è possibile "raggruppare" in base ai risultati della funzione "mi piace"?


Supponiamo Ho una tabella MESA con una delle colonne è una stringa enorme. E sto contando il numero di righe corrispondenti modelli particolari:

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

Quindi supponiamo che il risultato di questa query è:

FRUIT..afsafafasfa ... RED_APPLE 20

FRUTTA ..afsafafasfa ... YELLOW_APPLE 12

FRUIT..afsafafasfa ... GREEN_APPLE 3

FRUIT..afsafafasfa ... PURPLE_ORANGE 4

FRUIT..afsafafasfa ... RED_ORANGE 45

Ma io voglio i miei risultati siano:

APPLE 35

ORANGE 49


È possibile fare? Se è così, in che modo? :)

I commenti e gli snippet di codice sono molto apprezzati.

PS: Naturalmente la query ei risultati sono più complicati rispetto all'esempio precedente. L'ho appena scritto come per semplicità di spiegazione.

Cin cin ..

+2

E a proposito di stringhe del genere: "FRUIT..afsafafasfa ... ORANGE_APPLE"?;) – ThinkJet

+0

Sì, questa è una buona osservazione. Per il mio caso, non è molto probabile avere stringhe del genere. Immagino dipenda dall'ordine dei casi. – someone

risposta

11

Certo:

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, funziona, +1 – ThinkJet

+0

Grazie Dave. Mi piace questo con 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%' 

Vorrei che il lavoro?

+0

Grazie per la risposta JNKyle. Ho anche pensato a questo, ma la risposta di Dave è più appropriata per il mio caso (dato che ho molti gruppi da fare) – someone

0

qualcosa di simile?

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

non è possibile utilizzare count (*) senza clausola di raggruppamento ... (guarda selezione interna) – ThinkJet

+0

Grazie per la risposta Marco. – someone

+0

@ ThinkJet- Scusate, pensavo di avere un gruppo BY nel SELECT interno –

2

Un'altra variante di David Markle risposta:

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 

Stessa cosa, ma solo 1 CASO necessaria, che semplifica il supporto ...

+0

Grazie per la risposta ThinkJet. Molto apprezzato. – someone

0

vorrei farlo in questo modo - richiede solo una singola modifica per aggiungere ulteriori tipi di frutta.

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 

Se le stringhe sono in modo affidabile nel formato che avete mostrato nei dati di esempio, vorrei prendere in considerazione cambiando il predicato di una condizione, WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'.