#sql #oracle
#sql #Oracle
Вопрос:
Я новичок в Oracle. Попытка сгруппировать столбцы на основе определенного текста и суммировать другие столбцы.
допустим, у меня есть таблицы ниже
Я хочу сгруппировать всех людей с фамилией. Как показано ниже
Я понятия не имею, как мне поступить. Примечание: Может быть несколько имен, но я просто хочу отфильтровать Sharma, Decosta и Liver.
Обновление вопроса. Извините за обновление вопроса. но в реальном сценарии строка поиска не всегда находится на последнем месте.
Позвольте мне привести вам другой пример.
Вывод.
Комментарии:
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