Как группировать столбцы на основе определенного текста и суммировать их с помощью базы данных ORACLE

#sql #oracle

#sql #Oracle

Вопрос:

Я новичок в Oracle. Попытка сгруппировать столбцы на основе определенного текста и суммировать другие столбцы.

допустим, у меня есть таблицы ниже

введите описание изображения здесь

Я хочу сгруппировать всех людей с фамилией. Как показано ниже

введите описание изображения здесь

Я понятия не имею, как мне поступить. Примечание: Может быть несколько имен, но я просто хочу отфильтровать Sharma, Decosta и Liver.

Обновление вопроса. Извините за обновление вопроса. но в реальном сценарии строка поиска не всегда находится на последнем месте.

Позвольте мне привести вам другой пример. c

Вывод.

введите описание изображения здесь

Комментарии:

1. Как вы определяете, какая фамилия? Что, если это двуствольное имя ? Вероятно, лучше разделить Name столбец на два столбца, а именно First_Name и Last_Name .

2. К сожалению, это не реальные данные. У меня есть строка, которую мне нужно найти на основе некоторого ключевого слова. Поэтому я не могу разделить его

3. Dog gone dogs считается одним появлением dog или двумя? Dogs не могут использовать ручки , считается ли одно появление dog и одно из pen? Как насчет того, что Шон Пенн проехал по Пенсильвании без штрафов, пока не достиг предпоследней мили, сколько там ручек ?

Ответ №1:

Предлагаемые до сих пор запросы, похоже, работают, чтобы получить то, что вам нужно. Но приведенное ниже делает:

 With inputs as
(
    select 'Rahul Kumar Sharma' as Name, 10 as No_of_beer_bottles from dual union all
    select 'Rohith Kumar Sharma' as Name, 5 as No_of_beer_bottles from dual union all
    select 'Sharma' as Name, 20 as No_of_beer_bottles from dual union all
    select 'Rahul Kumar Varma' as Name, 10 as No_of_beer_bottles from dual
)
select  SUBSTR(name,Instr(name,' ',-1) 1) as Name, sum(No_of_beer_bottles) as No_of_beer_bottles
from    inputs
group by SUBSTR(name,Instr(name,' ',-1) 1);
  

Вывод:

введите описание изображения здесь

Комментарии:

1. Привет, спасибо за ответ. Это работает для данного вопроса, однако, к сожалению, в реальном сценарии не так, чтобы последнее имя появилось в конце. в основном я создал фиктивную дату. В двух словах, у меня есть строка, и мне нужно выполнить поиск столбцов на основе этой строки и суммировать их значение. приведена строка поиска.

2. @Varun, Ок . Откуда вы знаете, что вам нужно извлечь и сделать это именем? Если у вас есть правила. Расскажите нам, мы попробуем.

3. Это предопределенное слово, в приведенном выше примере pen и dog

Ответ №2:

Вы можете использовать regexp_substr() :

 select regexp_substr(name, '[^ ] $') as last_name, sum(num_beers)
from t
group by regexp_substr(name, '[^ ] $');
  

Комментарии:

1. Это должно быть sum. Правильно?

2. Я получаю результат ниже, который не суммируется. LAST_NAME COUNT Декоста 1 Декоста 1 Шарма 2 Печень 1 Шарма 1

3. Исправьте, это должно быть sum. Я пытался сделать это, выбрав last_name, sum(count) из (выберите regexp_substr(name, ‘[^ ] $’) как last_name, count(*) как count из beer group с помощью regexp_substr(name, ‘[^ ] $’) ) группируйте по last_name; но не помогайте

4. @Varun, вы пробовали решение, которое я опубликовал? Это нормально работает?

5. @Ranagal . . . Да, это должно быть sum() и теперь есть.

Ответ №3:

Если вы используете таблицу со всеми словами, которые вы ищете (или определяете их в общем табличном выражении, как я сделал ниже), вы можете присоединиться к этому поисковому запросу, а затем суммировать числовой столбец.

Запрос 1

 WITH
    search_words (word)
    AS
        (SELECT 'Sharma' FROM DUAL
         UNION ALL
         SELECT 'Decosta' FROM DUAL
         UNION ALL
         SELECT 'Liver' FROM DUAL),
    d (name, num_beers)
    AS
        (SELECT 'Ravi Sharma', 1 FROM DUAL
         UNION ALL
         SELECT 'Sam Decosta', 4 FROM DUAL
         UNION ALL
         SELECT 'Jhony Liver', 5 FROM DUAL
         UNION ALL
         SELECT 'Ravi Sharma', 2 FROM DUAL
         UNION ALL
         SELECT 'Rohul Sharma', 3 FROM DUAL
         UNION ALL
         SELECT 'Jhon Decosta', 3 FROM DUAL
         UNION ALL
         SELECT 'V Decosta', 3 FROM DUAL)
  SELECT sw.word, SUM (d.num_beers) AS total_beer
    FROM search_words sw, d
   WHERE INSTR (UPPER (d.name), UPPER (sw.word)) > 0
GROUP BY sw.word;
  

Результат 1

       WORD    TOTAL_BEER
__________ _____________
Decosta               10
Sharma                 6
Liver                  5
  

Запрос 2

 WITH
    search_words (word)
    AS
        (SELECT 'Pen' FROM DUAL
         UNION ALL
         SELECT 'Dog' FROM DUAL),
    d (name, quantity)
    AS
        (SELECT 'Ravi have red pens', 2 FROM DUAL
         UNION ALL
         SELECT 'Sam''s grifriend have black dogs', 4 FROM DUAL
         UNION ALL
         SELECT 'Jhony has blue pen', 1 FROM DUAL
         UNION ALL
         SELECT 'Ravi has white dog', 1 FROM DUAL
         UNION ALL
         SELECT 'Rahul has small dogs', 3 FROM DUAL
         UNION ALL
         SELECT 'There are pens inside Jhon''s car', 3 FROM DUAL
         UNION ALL
         SELECT 'My dog and me are flying.', 1 FROM DUAL)
  SELECT sw.word, SUM (d.quantity) AS total_quantity
    FROM search_words sw, d
   WHERE INSTR (UPPER (d.name), UPPER (sw.word)) > 0
GROUP BY sw.word;
  

Результат 2

    WORD    TOTAL_QUANTITY
_______ _________________
Dog                     9
Pen                     6