запрос db2 на основе группировки для вычисляемых столбцов - PullRequest
0 голосов
/ 24 января 2019

У меня есть запрос, который работает до получения базовых результатов, но у меня возникла проблема, пытаясь выяснить, как выбрать другие столбцы / переменные на основе разных группировок.

База запросаэто:

SELECT
 EmpID,
 managerID,
 Group,
 quant as sales,
from products p
where active_date > CURRENT_DATE - 50 days;

Проблема в том, что эти записи для 50 дней, но я хочу выбрать 3 новых вычисления в качестве столбцов, которые основаны на условиях в течение последних 25 дней.

Скажите, явозврат на данный момент:

empId  |  managerID  |  group  |  sales
=======================================
123          1            A        4
321          1            B        2
516          1            C        8
345          2            D        4
839          2            E        7
849          2            F        2
192          3            G        9
221          4            H        3

Поэтому я хотел бы создать сумму продаж на основе группы по empID (сумма sales, по empID), по managerID, а затем итого (но я хотел бы основать здесь группировку только записей за последние 25 дней)

Идея моего ожидаемого результата (при условии, что все предыдущие 50-дневные записи были также в последних 25дней):

empId  |  managerID  |  group  |  sales  | salesEmpID  |  salesMngID  |  SalesTotal
====================================================================================
123          1            A        4           4             14             39
321          1            A        2           2             14             39
516          1            A        8           8             14             39
345          2            A        4           4             13             39
839          2            A        7           7             13             39
849          2            A        2           2             13             39
192          3            A        9           9              9             39
221          4            A        3           3              3             39

Таким образом, для группы продуктов A это дает мне продажи каждого сотрудника, а также этого менеджера по продажам, а затем общий объем продаж, все для группы продуктов A

Как я могу получитьчто-то подобное, а также сделать сюрe сумма количества основана на последних 25 днях, даже если запрос длился 50 дней?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вот решение, которое должно работать, если ваша СУБД не поддерживает оконные функции.

Оно работает путем создания серии объединений для вычисления промежуточных итогов для каждой группы (сотрудник, менеджер, итог).См. эту скрипту БД (я не знаю о скрипте DB2, поэтому я использовал MySQL5.7, но, насколько это касается, она должна работать на DB2):

SELECT 
    t.empID,
    t.managerID,
    t.groupID,
    t.sales,
    temp.sales salesEmpID,
    tmng.sales salesMngID,
    tall.sales salesTotal
FROM 
    mytable t
    INNER JOIN (
        SELECT empID, SUM(sales) sales 
        FROM mytable 
        WHERE active_date > CURRENT_DATE - INTERVAL 25 DAY 
        GROUP BY empID
    ) temp ON temp.empID = t.empID
    INNER JOIN (
        SELECT managerID, SUM(sales) sales 
        FROM mytable 
        WHERE active_date > CURRENT_DATE - INTERVAL 25 DAY 
        GROUP BY managerID
    ) tmng ON tmng.managerID = t.managerID
    CROSS JOIN (
        SELECT SUM(sales) sales 
        FROM mytable 
        WHERE active_date > CURRENT_DATE - INTERVAL 25 DAY
    ) tall
WHERE t.active_date > CURRENT_DATE - INTERVAL 50 DAY;

| empID | managerID | groupID | sales | salesEmpID | salesMngID | salesTotal |
| ----- | --------- | ------- | ----- | ---------- | ---------- | ---------- |
| 123   | 1         | A       | 4     | 4          | 14         | 39         |
| 321   | 1         | B       | 2     | 2          | 14         | 39         |
| 516   | 1         | C       | 8     | 8          | 14         | 39         |
| 345   | 2         | D       | 4     | 4          | 13         | 39         |
| 839   | 2         | E       | 7     | 7          | 13         | 39         |
| 849   | 2         | F       | 2     | 2          | 13         | 39         |
| 192   | 3         | G       | 9     | 9          | 9          | 39         |
| 221   | 4         | H       | 3     | 3          | 3          | 39         |

0 голосов
/ 25 января 2019

Как вы ищете условные оконные функции?

select EmpID, managerID, Group, quant as sales,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by empId) as emp_25,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by managerId) as manager_25,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by group) as group_25
from products p
where active_date > CURRENT_DATE - 50 days;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...