SQL: действительно ли возможно 'сгруппироваться' согласно результатам 'подобной' функции?

Я использую 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%')

Поэтому давайте предположим, что результат этого запроса:

ФРУКТЫ.. afsafafasfa... RED_APPLE 20

ФРУКТЫ.. afsafafasfa... YELLOW_APPLE 12

ФРУКТЫ.. afsafafasfa... GREEN_APPLE 3

ФРУКТЫ.. afsafafasfa... PURPLE_ORANGE 4

ФРУКТЫ.. afsafafasfa... RED_ORANGE 45

Но я хочу, чтобы мои результаты были:

APPLE 35

ОРАНЖЕВЫЕ 49


Действительно ли это возможно сделать? Если так, как так?:)

Комментарии и фрагменты кода очень ценятся.

PS: Конечно, запрос и результаты более сложны, чем вышеупомянутый пример. Я просто записал это как ради простоты для объяснения.

Удачи..

10
задан Aldwoni 19 February 2018 в 11:20
поделиться

5 ответов

Конечно:

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;
12
ответ дан 3 December 2019 в 23:11
поделиться

Другой вариант ответа Дэвида Маркл:

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, что упрощает поддержку ...

2
ответ дан 3 December 2019 в 23:11
поделиться

Что-то вроде этого?

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
ответ дан 3 December 2019 в 23:11
поделиться
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
ответ дан 3 December 2019 в 23:11
поделиться

Я бы сделал это так - требуется только одно изменение, чтобы добавить дополнительные типы фруктов.

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

0
ответ дан 3 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: