views:

74

answers:

5

Hello,

I am using Oracle SQL and I want to group some different rows that 'like' function results. To elaborate with an example:


Let's assume I have a table MESA with one of the columns is a huge string. And I am counting the number of rows matching particular patterns:

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

So let's assume the result of this query is:

FRUIT..afsafafasfa...RED_APPLE 20

FRUIT..afsafafasfa...YELLOW_APPLE 12

FRUIT..afsafafasfa...GREEN_APPLE 3

FRUIT..afsafafasfa...PURPLE_ORANGE 4

FRUIT..afsafafasfa...RED_ORANGE 45

But I want my results to be:

APPLE 35

ORANGE 49


Is this possible to do? If so, how so? : )

Comments and code snippets are much appreciated.

PS: Of course the query and the results are more complicated than the above example. I just wrote it like for the sake of simplicity to explain.

Cheers..

A: 
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%'

Would that work?

JNK
Thanks for the answer JNKyle. I've also thought about this but Dave's answer is more appropriate for my case (as I have lots of groups to be made)
someone
+7  A: 

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;
Dave Markle
Ok, it works, +1
ThinkJet
Thanks Dave. I love this WITH thingie : )
someone
A: 

Something like this?

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
Mark Baker
you can't use count(*) without grouping clause ... (look at internal select)
ThinkJet
Thanks for the answer Mark.
someone
@ThinkJet- Sorry, I thought I did have a GROUP BY in the internal SELECT
Mark Baker
+2  A: 

Another variant of David Markle answer:

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  

Same thing, but only 1 CASE required, which simplifies support ...

ThinkJet
Thanks for the answer ThinkJet. Much appreciated.
someone
A: 

I would do it this way -- only requires a single change to add additional types of fruit.

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

If your strings are reliably in the format you showed in your sample data, I would consider changing the predicate to one condition, WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'.

Dave Costa