СОЮЗ на 2 объединенных запроса - PullRequest
0 голосов
/ 02 января 2019

У меня есть 2 рабочих запроса, которые объединены подвыборками, использующими WITH в DB2.

Каждый из них работает отдельно, но я не могу найти лучший способ их правильно объединить или объединить.

Первый запрос:

  with c as(
select
  employee,
  sum(salesPrice) as priorSpecifics
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2018-01-01' and '2018-01-31'
and g.details = 'CategoryOne'
group by employee
), d as(
select
  employee,
  sum(salesPrice) as priorTotals
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2018-01-01' and '2018-01-31'
group by employee
)
Select  ifnull(c.employee,d.employee) as employee
      ,c.priorSpecifics
      ,d.priorTotals
      ,cast(Round((DEC(c.priorSpecifics,12,2)/DEC(d.priorTotals,12,2)) * 100,2) as decimal(12,2)) as priorPercent
  from c full join d ON (c.employee = d.employee);

Возвращает 4 столбца

, а второй запрос

with c as(
select
  employee,
  sum(salesPrice) as currentSpecifics
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2019-01-01' and '2019-01-31'
and g.details = 'CategoryOne'
group by employee
), d as(
select
  employee,
  sum(salesPrice) as currentTotals
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2019-01-01' and '2019-01-31'
group by employee
)
Select  ifnull(c.employee,d.employee) as employee
      ,c.currentSpecifics
      ,d.currentTotals
      ,cast(Round((DEC(c.currentSpecifics,12,2)/DEC(d.currentTotals,12,2)) * 100,2) as decimal(12,2)) as currentPercent
  from c full join d ON (c.employee = d.employee);

Также возвращает 4.Поле employee - это единственное, что совместно используется всеми.

Как я могу объединить это в один запрос, чтобы получить один столбец сотрудника, а затем все мои столбцы суммы / процента после?

Ответы [ 2 ]

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

Если все вышеперечисленные запросы работают, то у вас уже есть все необходимое.
Вы должны объединить из 1-й группы, первые 2, чтобы сделать запрос prior, затем
из 2-й группы, чтобы сделать запрос cur
и, наконец, присоедините запрос prior к запросу cur:

with 
c as(
select
  employee,
  sum(salesPrice) as priorSpecifics
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2018-01-01' and '2018-01-31'
and g.details = 'CategoryOne'
group by employee
),

d as(
select
  employee,
  sum(salesPrice) as priorTotals
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2018-01-01' and '2018-01-31'
group by employee
),

prior as (
Select  ifnull(c.employee,d.employee) as employee
      ,c.priorSpecifics
      ,d.priorTotals
      ,cast(Round((DEC(c.priorSpecifics,12,2)/DEC(d.priorTotals,12,2)) * 100,2) as decimal(12,2)) as priorPercent
  from c full join d ON (c.employee = d.employee)
),

e as(
select
  employee,
  sum(salesPrice) as currentSpecifics
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2019-01-01' and '2019-01-31'
and g.details = 'CategoryOne'
group by employee
),

f as(
select
  employee,
  sum(salesPrice) as currentTotals
from schema1.orders g
    inner join dateSchema.dates d
    on g.dateField = d.dateField
where  d.newDate between '2019-01-01' and '2019-01-31'
group by employee
),

cur as (
Select  ifnull(e.employee,f.employee) as employee
      ,e.currentSpecifics
      ,f.currentTotals
      ,cast(Round((DEC(e.currentSpecifics,12,2)/DEC(f.currentTotals,12,2)) * 100,2) as decimal(12,2)) as currentPercent
  from e full join f ON (e.employee = f.employee)
)

Select  ifnull(p.employee, c.employee) as employee
      ,p.priorSpecifics
      ,p.priorTotals
      ,p.priorPercent
      ,c.currentSpecifics
      ,c.currentTotals
      ,c.currentPercent
from prior p full join cur c ON (c.employee = c.employee);
0 голосов
/ 02 января 2019

Я думаю, что вы можете делать все, что вы хотите с условным агрегированием:

select employee,
       sum(case when d.newDate between '2018-01-01' and '2018-01-31' and g.details = 'CategoryOne' then salesPrice end) as priorSpecifics,
       sum(case when d.newDate between '2019-01-01' and '2019-01-31' and g.details = 'CategoryOne' then salesPrice end) as currentSpecifics,
       sum(case when d.newDate between '2018-01-01' and '2018-01-31' then salesPrice end) as priorTotals,
       sum(case when d.newDate between '2019-01-01' and '2019-01-31' then salesPrice end) as currentTotals
from schema1.orders g inner join
     dateSchema.dates d
     on g.dateField = d.dateField
group by employee;

Я дам вам заполнить дополнительные вычисления.

...