2010-07-21 174 views
10

我正在使用Oracle SQL,我想将“喜欢”函数结果的一些不同的行分组。为了用一个例子说明一下:SQL:根据'like'函数的结果是否可以'按'分组?


假设我有一个表MESA与一列是一个巨大的字符串。和我指望的行数匹配特定的模式:

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

现在,让我们假设此查询的结果是:

FRUIT..afsafafasfa ... RED_APPLE 20

水果..afsafafasfa ... YELLOW_APPLE 12

FRUIT..afsafafasfa ... GREEN_APPLE 3

FRUIT..afsafafasfa ... PURPLE_ORANGE 4

FRUIT..afsafafasfa ... RED_ORANGE 45

但我想我的结果是:

APPLE 35

ORANGE 49


这可能吗?如果是这样,怎么会这样? :)

评论和代码片断非常感谢。

PS:当然查询和结果比上面的例子更复杂。我只是为了简单起见而写它来解释。

干杯..

+2

这样的字符串如何处理:'FRUIT..afsafafasfa ... ORANGE_APPLE“?;) – ThinkJet 2010-07-21 12:56:04

+0

是的,这是一个很好的评论。对我而言,这样的字符串不太可能。我想这取决于案件的顺序。 – someone 2010-07-21 13:08:31

回答

11

肯定的:

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

好吧,它的工作原理,+1 – ThinkJet 2010-07-21 12:56:44

+0

感谢戴夫。我爱这个东西:) – someone 2010-07-21 13:09:12

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

将这项工作?

+0

感谢您的答案JNKyle。我也想过这个,但戴夫的答案更适合我的情况(因为我有很多团体可以制作) – someone 2010-07-21 13:10:34

0

像这样的事情?

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

你不能使用计数(*)没有分组条款...(看看内部选择) – ThinkJet 2010-07-21 13:05:31

+0

感谢您的答案马克。 – someone 2010-07-21 13:09:40

+0

@ ThinkJet-对不起,我以为我确实有一个GROUP BY在内部SELECT – 2010-07-21 13:25:19

2

大卫马克尔答案的另一变型:需要

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 

同样的事情,但只有1例,从而简化了支持...

+0

谢谢你的回答ThinkJet。非常感激。 – someone 2010-07-21 13:11:03

0

我会做这种方式 - 只需要添加其他类型水果的单一更改。

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 

如果你的字符串是可靠地在您的样本数据显示的格式,我会考虑改变谓词一个条件,WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'