ORACLE SQL: Несколько слоев группировки и Промежуточные результаты

#sql #oracle #group-by

Вопрос:

В ORACLE SQL (ORACLE 19c) я ищу способ получить следующее содержимое таблицы

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

… аналогично структурированы (сгруппированы) следующим образом:

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

В первом столбце данные должны быть сгруппированы по:

  1. отдел
  2. ДАТА НАЧАЛА РАБОТЫ, если ДАТА НАЧАЛА работы находится между «2021-01-01» И «2021-12-31»
  3. ОПИСАНИЕ(ы)РАБОТЫ
  4. ИМЯ(имена)

Во второй колонке «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 только отделам.