SQL-запрос для группировки по категориям - PullRequest
1 голос
/ 25 апреля 2019

Использование SQL Server 2016

У меня есть следующая таблица:

Action Id   Epic    Due Date    First Name
Action 1    Epic 1  27-Feb-19   Tom
Action 2    Epic 2  28-Feb-19   John
Action 3    Epic 3  1-Mar-19    Ana
Action 4    Epic 3  15-Apr-19   Ana

Можно ли разработать запрос со следующим выводом?

Action/Epic   Due Date  First Name   Type
Epic 1                               Epic
Action 1      27-Feb-19 Tom          Action
Epic 2                               Epic
Action 2      28-Feb-19 John         Action
Epic 3                               Epic
Action 3      1-Mar-19  Ana          Action
Action 4      15-Apr-19 Ana          Action

1 Ответ

3 голосов
/ 25 апреля 2019

Да, вы можете сделать это следующим образом (я полагаю, одним из многих способов):

Таблица

create table test (
    actionid varchar(100),
    epic varchar(100),
    duedate varchar(100),
    firstname varchar(100)
);

insert into test values
('Action 1', 'Epic 1', '27-Feb-19', 'Tom'),
('Action 2', 'Epic 2', '28-Feb-19', 'John'),
('Action 3', 'Epic 3', '1-Mar-19', 'Ana'),
('Action 4', 'Epic 3', '15-Apr-19', 'Ana');

Запрос

with data as (
    select 
        row_number() over(order by actionid) as sr,
        *
    from test
),
compiled as (
    select min(sr) as sr, epic as actionid, '' as epic, '' as duedate, '' as firstname, 'Epic' as type
    from data group by epic
    union all
    select *, 'Action' as type from data
)
select actionid, epic, duedate, firstname, type from compiled order by sr, actionid desc

Результат

actionid    epic    duedate   firstname type
Epic 1                                  Epic
Action 1    Epic 1  27-Feb-19   Tom     Action
Epic 2                                  Epic
Action 2    Epic 2  28-Feb-19   John    Action
Epic 3                                  Epic
Action 3    Epic 3  1-Mar-19    Ana     Action
Action 4    Epic 3  15-Apr-19   Ana     Action

Пример: https://rextester.com/JIN82148

Объяснение

  • Присвойте каждой строке номер после сортировки по actionid
  • Для каждой строки вытащите Epic.Если эпическая копия повторяется, получите минимальный серийный номер
  • Получить записи действий
  • Объедините данные вместе
  • Сортируйте их по серийному номеру, зная, что некоторые эпические и экшн будут иметьодин и тот же серийный номер, поскольку они происходят из одной и той же строки
  • После сортировки серийного номера выполните сортировку по Epic, чтобы E предшествовало A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...