【问题标题】:SQL: Is it possible to 'group by' according to 'like' function's results?SQL:是否可以根据'like'函数的结果'group by'?
【发布时间】:2011-03-18 23:29:51
【问题描述】:

我正在使用 Oracle SQL,我想对一些“喜欢”函数结果的不同行进行分组。举例说明:


假设我有一个表 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

FRUIT..afsafafasfa...YELLOW_APPLE 12

FRUIT..afsafafasfa...GREEN_APPLE 3

FRUIT..afsafafasfa...PURPLE_ORANGE 4

FRUIT..afsafafasfa...RED_ORANGE 45

但我希望我的结果是:

苹果 35

橙色 49


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

非常感谢评论和代码sn-ps。

PS:当然查询和结果比上面的例子复杂。为了方便解释,我就这么写了。

干杯..

【问题讨论】:

  • 这样的字符串怎么样:'FRUIT..afsafafasfa...ORANGE_APPLE"?;)
  • 是的,这句话很好。就我而言,不太可能有这样的字符串。我想这取决于案件的顺序。

标签: sql oracle group-by grouping sql-like


【解决方案1】:
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%'

这行得通吗?

【讨论】:

  • 感谢 JNKyle 的回答。我也考虑过这一点,但戴夫的回答更适合我的情况(因为我有很多小组要做)
【解决方案2】:

当然:

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;

【讨论】:

  • 谢谢戴夫。我喜欢这个 WITH thingie :)
【解决方案3】:

这样的?

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

【讨论】:

  • 你不能在没有分组子句的情况下使用 count(*) ...(查看内部选择)
  • @ThinkJet- 抱歉,我以为我在内部 SELECT 中有一个 GROUP BY
【解决方案4】:

David Markle 答案的另一个变体:

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 个 CASE,这简化了支持...

【讨论】:

  • 感谢 ThinkJet 的回答。非常感谢。
【解决方案5】:

我会这样做——只需要进行一次更改即可添加其他类型的水果。

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

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2020-11-18
    • 2014-11-22
    相关资源
    最近更新 更多