我已经查看了整个网站,但找不到解决我的问题的方法。我试图尽可能地抽象它。
我的查询是这样的:
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)
您正在尝试执行的操作看起来非常像枢轴操作。您可以使用条件聚合在没有派生表的情况下实现您正在寻找的结果:
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)
| 归档时间: |
|
| 查看次数: |
1922 次 |
| 最近记录: |