#sql #oracle #group-by
Вопрос:
В ORACLE SQL (ORACLE 19c) я ищу способ получить следующее содержимое таблицы
… аналогично структурированы (сгруппированы) следующим образом:
В первом столбце данные должны быть сгруппированы по:
- отдел
- ДАТА НАЧАЛА РАБОТЫ, если ДАТА НАЧАЛА работы находится между «2021-01-01» И «2021-12-31»
- ОПИСАНИЕ(ы)РАБОТЫ
- ИМЯ(имена)
Во второй колонке «1» обозначает, когда люди начали работать в 2021 году
Наконец, промежуточные результаты о СУММЕ людей, которые начали работать в ОТДЕЛЕ (в 2021 году), должны быть выведены (внизу) для каждой группы ОТДЕЛОВ.
Срезанный код для создания табличных данных:
SELECT 'Zimmer, Hans' AS NAME,
'1978-10-01' AS JOB_START_DATE,
'2021-01-31' AS JOB_END_DATE,
'Movie Composer' AS JOB_DESCRIPTION,
'Score' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Armstrong, Louis' AS NAME,
'1988-06-01' AS JOB_START_DATE,
'2021-06-30' AS JOB_END_DATE,
'Jazz Musician' AS JOB_DESCRIPTION,
'Score' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Davis, Miles' AS NAME,
'2011-10-01' AS JOB_START_DATE,
'2021-03-31' AS JOB_END_DATE,
'Jazz Musician' AS JOB_DESCRIPTION,
'Music' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Coltrane, John' AS NAME,
'2015-08-01' AS JOB_START_DATE,
'2021-06-30' AS JOB_END_DATE,
'Jazz Musician' AS JOB_DESCRIPTION,
'Music' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Cobain, Kurt' AS NAME,
'2021-08-01' AS JOB_START_DATE,
'2022-07-31' AS JOB_END_DATE,
'Rock Musician' AS JOB_DESCRIPTION,
'Music' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Keys, Alicia' AS NAME,
'2021-09-01' AS JOB_START_DATE,
'2022-08-31' AS JOB_END_DATE,
'Pop Musician' AS JOB_DESCRIPTION,
'Music' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Tarantino, Quentin' AS NAME,
'2021-03-01' AS JOB_START_DATE,
'2021-08-31' AS JOB_END_DATE,
'Movie Director' AS JOB_DESCRIPTION,
'Film' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Pitt, Brad' AS NAME,
'1999-10-01' AS JOB_START_DATE,
'2021-01-26' AS JOB_END_DATE,
'Movie Actor' AS JOB_DESCRIPTION,
'Film' AS DEPARTMENT
FROM DUAL
UNION ALL
SELECT 'Nolan, Christopher' AS NAME,
'2020-05-01' AS JOB_START_DATE,
'2021-03-31' AS JOB_END_DATE,
'Movie Director' AS JOB_DESCRIPTION,
'Film' AS DEPARTMENT
FROM DUAL;
Возможно ли в ORACLE SQL получить данные таблицы структурированными / сгруппированными по желанию?
Если да, то как я могу этого добиться?
Комментарии:
1. что вы пробовали до сих пор?
2. Я понятия не имею, что делать, чтобы получить желаемый формат вывода. У тебя есть какие-нибудь идеи?
Ответ №1:
Похоже, вы хотите использовать CUBE
условную агрегацию, а затем отфильтровать наборы группировок:
SELECT name,
job_description ,
department,
COUNT(CASE EXTRACT(YEAR FROM job_start_date) WHEN 2021 THEN 1 END)
AS number_of_2021_jobs
FROM table_name
GROUP BY
CUBE(name, job_description, department)
HAVING GROUPING_ID(name, job_description, department) IN (0, 6)
ORDER BY
department
Который для ваших выборочных данных выводит:
Имя ОПИСАНИЕ РАБОТЫ отдел NUMBER_OF_2021_JOBS Нолан, Кристофер Кинорежиссер Фильм 0 Питт, Брэд Киноактер Фильм 0 Тарантино, Квентин Кинорежиссер Фильм 1 Фильм 1 Кобейн, Курт Рок-музыкант Музыка 1 Колтрейн, Джон Джазовый музыкант Музыка 0 Дэвис, Майлз Джазовый музыкант Музыка 0 Ключи, Алисия Поп-музыкант Музыка 1 Музыка 2 Армстронг, Луи Джазовый музыкант Счет 0 Zimmer, Hans Композитор фильмов Счет 0 Счет 0
Примечание.Если вам нужны значения в одном столбце , объедините name
job_description
department
столбцы, и и поместите между ними символы новой строки.
бд<>скрипка <>здесь
Комментарии:
1. Большое спасибо! Вот чего я хочу. Как добавить столбец «JOB_START_DATE»? Мне действительно нужно знать, когда именно человек начал свою работу. Когда я добавляю JOB_START_DATE в предложение SELECT, CUBE и HAVING, я получаю странный вывод… Что означает «В (0,6)» в предложении HAVING?
2. @Питер Использует
MAX
? бд<>скрипка<>3.
IN (0, 6)
определяет, какие наборы группировок вы хотите получить изCUBE
. УдалитеHAVING
предложение, и вы сможете увидеть все сгенерированные строки; вам просто нужны строки со всеми значениями или только со значением отдела0
, и набор группировок th соответствует всем значениям и6
только отделам.