Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关于2个联接查询的并集_Sql_Db2_Union - Fatal编程技术网

Sql 关于2个联接查询的并集

Sql 关于2个联接查询的并集,sql,db2,union,Sql,Db2,Union,我有两个工作查询,它们通过DB2中的WITH子选择连接起来 它们各自独立工作,但我似乎找不到最好的方法来正确地组合或结合它们 第一个查询: 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 betwee

我有两个工作查询,它们通过DB2中的
WITH
子选择连接起来

它们各自独立工作,但我似乎找不到最好的方法来正确地组合或结合它们

第一个查询:

  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列,然后得到下面所有的总和/百分比列?

我认为通过条件聚合,您可以做任何您想做的事情:

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;

我将让您填写额外的计算。

我认为您可以通过条件聚合完成所有您想要的事情:

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;

我将让您填写额外的计算。

如果以上所有查询都有效,那么您已经拥有了所需的一切
您必须从第一组(前两组)中组合,以进行
previor
查询,然后进行
从第二组进行
cur
查询
最后将
previor
查询连接到
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);

如果以上所有查询都正常工作,那么您已经拥有了所需的一切
您必须从第一组(前两组)中组合,以进行
previor
查询,然后进行
从第二组进行
cur
查询
最后将
previor
查询连接到
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);

尝试在这里使用别名来表示百分比是行不通的,不过如果我将整个计算都放在除法的每一端,那么就行了。在DB2中,是否没有办法在select列中使用别名作为其他select列的条件?尝试在这里使用别名作为百分比是行不通的,不过如果我将整个计算都放在除法的每一端,那么它就会起作用。DB2中是否没有办法在select中使用别名作为其他select列的条件?