将多个联合语句分组

Rub*_*ten 5 db2 pivot

我已经查看了整个网站,但找不到解决我的问题的方法。我试图尽可能地抽象它。

我的查询是这样的:

select sup, a, b, c, d
from
(
    select sup, a, 0, 0, 0 from x where y = 1 group by sup
    union
    select sup, 0, b, 0, 0 from x where y = 2 group by sup
    union
    select sup, a, 0, c, 0 from x where y = 3 group by sup
    union
    select sup, a, 0, 0, d from x where y = 4 group by sup
)
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了我期望的结果。

我想要的是将这些结果分组在 sup 列中。当我GROUP BY sup在此 SQL 之后添加时,它会出现以下错误:

[SQL0122] SELECT 列表中的列 SUP 或表达式无效。

有人可以帮我解决这个问题吗?

我真正使用的 SQL 是这样的:

select 
    date(tt1.datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, 
    tt1.sts_supplier_number as sts_supplier_number, 
    tt1.beschadigd as beschadigd, 
    tt1.incompleet as incompleet, 
    tt1.verkeer_geleverd as verkeerd_geleverd, 
    tt1.manco as manco,
    tt1.fout_besteld as fout_besteld,
    tt1.niet_besteld as niet_besteld,
    tt1.fout_magazijn as fout_magazijn
from 
(       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            count(orl_conditie_code) as beschadigd, 0 as incompleet, 0 as verkeer_geleverd, 0 as manco, 0 as fout_besteld, 0 as niet_besteld, 0 as fout_magazijn 
        from stsgopf where orl_conditie_code = '001' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
    union       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            0 as beschadigd, count(orl_conditie_code) as incompleet, 0 as verkeer_geleverd, 0 as manco, 0 as fout_besteld, 0 as niet_besteld, 0 as fout_magazijn 
        from stsgopf where orl_conditie_code = '002' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
    union       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            0 as beschadigd, 0 as incompleet, count(orl_conditie_code) as verkeer_geleverd, 0 as manco, 0 as fout_besteld, 0 as niet_besteld, 0 as fout_magazijn
        from stsgopf where orl_conditie_code = '003' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
    union       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            0 as beschadigd, 0 as incompleet, 0 as verkeer_geleverd, count(orl_conditie_code) as manco, 0 as fout_besteld, 0 as niet_besteld, 0 as fout_magazijn
        from stsgopf where orl_conditie_code = '004' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
    union       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            0 as beschadigd, 0 as incompleet, 0 as verkeer_geleverd, 0 as manco, count(orl_conditie_code) as fout_besteld, 0 as niet_besteld, 0 as fout_magazijn  
        from stsgopf where orl_conditie_code = '201' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
    union       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            0 as beschadigd, 0 as incompleet, 0 as verkeer_geleverd, 0 as manco, 0 as fout_besteld, count(orl_conditie_code) as niet_besteld, 0 as fout_magazijn 
        from stsgopf where orl_conditie_code = '202' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
    union       
        select date(datum_toegevoegd_aan_stat) as datum_toegevoegd_aan_stat, sts_supplier_number, 
            0 as beschadigd, 0 as incompleet, 0 as verkeer_geleverd, 0 as manco, 0 as fout_besteld, 0 as niet_besteld, count(orl_conditie_code) as fout_magazijn 
        from stsgopf where orl_conditie_code = '203' 
        group by sts_supplier_number, date(datum_toegevoegd_aan_stat)
) as tt1
where date(tt1.datum_toegevoegd_aan_stat) between '2016-09-26' and '2016-09-29' 
group by sts_supplier_number
Run Code Online (Sandbox Code Playgroud)

And*_*y M 9

您正在尝试执行的操作看起来非常像枢轴操作。您可以使用条件聚合在没有派生表的情况下实现您正在寻找的结果:

SELECT
  sts_supplier_number,
  COUNT(CASE WHEN orl_conditie_code = '001' THEN orl_conditie_code END) AS beschadigd,
  COUNT(CASE WHEN orl_conditie_code = '002' THEN orl_conditie_code END) AS incompleet,
  COUNT(CASE WHEN orl_conditie_code = '003' THEN orl_conditie_code END) AS verkeer_geleverd,
  COUNT(CASE WHEN orl_conditie_code = '004' THEN orl_conditie_code END) AS manco,
  COUNT(CASE WHEN orl_conditie_code = '201' THEN orl_conditie_code END) AS fout_besteld,
  COUNT(CASE WHEN orl_conditie_code = '202' THEN orl_conditie_code END) AS niet_besteld,
  COUNT(CASE WHEN orl_conditie_code = '203' THEN orl_conditie_code END) AS fout_magazijn
FROM
  stsgopf
WHERE
  DATE(tt1.datum_toegevoegd_aan_stat) BETWEEN '2016-09-26' AND '2016-09-29'
  AND orl_conditie_code IN ('001', '002', '003', '004', '201', '202', '203')
GROUP BY
  sts_supplier_number
;
Run Code Online (Sandbox Code Playgroud)

请注意,上述内容将在指定的整个间隔内为您提供每个sts_supplier_number 的计数。如果您想要每个sts_supplier_number和 day 的计数,请添加DATE(tt1.datum_toegevoegd_aan_stat)到 GROUP BY 和 SELECT:

SELECT
  DATE(tt1.datum_toegevoegd_aan_stat) AS datum_toegevoegd_aan_stat,
  sts_supplier_number,
  COUNT(CASE WHEN orl_conditie_code = '001' THEN orl_conditie_code END) AS beschadigd,
  COUNT(CASE WHEN orl_conditie_code = '002' THEN orl_conditie_code END) AS incompleet,
  COUNT(CASE WHEN orl_conditie_code = '003' THEN orl_conditie_code END) AS verkeer_geleverd,
  COUNT(CASE WHEN orl_conditie_code = '004' THEN orl_conditie_code END) AS manco,
  COUNT(CASE WHEN orl_conditie_code = '201' THEN orl_conditie_code END) AS fout_besteld,
  COUNT(CASE WHEN orl_conditie_code = '202' THEN orl_conditie_code END) AS niet_besteld,
  COUNT(CASE WHEN orl_conditie_code = '203' THEN orl_conditie_code END) AS fout_magazijn
FROM
  stsgopf
WHERE
  DATE(tt1.datum_toegevoegd_aan_stat) BETWEEN '2016-09-26' AND '2016-09-29'
  AND orl_conditie_code IN ('001', '002', '003', '004', '201', '202', '203')
GROUP BY
  DATE(tt1.datum_toegevoegd_aan_stat),
  sts_supplier_number
;
Run Code Online (Sandbox Code Playgroud)