测试表及数据是这样:
销售日期 销售单位 单位代码 销售量 销售金额
201201 AA 001 100 100
201201 BB 002 200 200
201301 AA 001 90 90
201301 CC 003 80 80
需求是查询所有单位今年1月及去年同期的销售情况,这个测试数据查出的结果应该是 : 销售单位 单位代码 销售量 销售金额 销售量 销售金额
AA 001 100 100 90 90
BB 002 0 0 200 200
CC 003 80 80 0 0这样表述不知道是否清楚,表头是随便取的,主要是达到这么个需求
销售日期 销售单位 单位代码 销售量 销售金额
201201 AA 001 100 100
201201 BB 002 200 200
201301 AA 001 90 90
201301 CC 003 80 80
需求是查询所有单位今年1月及去年同期的销售情况,这个测试数据查出的结果应该是 : 销售单位 单位代码 销售量 销售金额 销售量 销售金额
AA 001 100 100 90 90
BB 002 0 0 200 200
CC 003 80 80 0 0这样表述不知道是否清楚,表头是随便取的,主要是达到这么个需求
SELECT 销售单位,
销售单位,
SUM(销售量) 销售量,
SUM(销售金额) 销售金额,
SUM(销售量1) 销售量,
SUM(销售金额1) 销售金额
FROM (
SELECT 销售日期, 销售单位, 单位代码,
SUM(销售量) 销售量,
SUM(销售金额) 销售金额, 0 销售量1, 0 销售金额1
FROM TEST
WHERE 销售日期 = '201301'
GROUP BY 销售日期, 销售单位, 单位代码
UNION ALL
SELECT 销售日期, 销售单位, 单位代码, 0 销售量, 0 销售金额,
SUM(销售量) 销售量1, SUM(销售金额) 销售金额1
FROM TEST
WHERE 销售日期 = TO_CHAR(ADD_MONTHS(TO_DATE('201301', 'YYYYMM'), -12),'YYYYMM')
GROUP BY 销售日期, 销售单位, 单位代码
)GROUP BY 销售单位, 单位代码;销售单位 销售单位 销售量 销售金额 销售量 销售金额
------------ ------------ ---------- ---------- ---------- ----------
CC 003 80 80 0 0
AA 001 90 90 100 100
BB 002 0 0 200 200
(select '201201' a,'AA' b,'001' c, '100' d, '100' e from dual union all
select '201201' a,'BB' b,'002' c, '200' d, '200' e from dual union all
select '201301' a,'AA' b,'001' c, '90' d, '90' e from dual union all
select '201301' a,'CC' b,'003' c, '80' d, '80' e from dual )select b 销售单位,c 单位代码 , sum(case a when '201201' then d else null end ) "201201销售量" ,sum(case a when '201201' then d else null end ) "201201销售金额" ,
sum(case a when '201301' then d else null end ) "201301销售量",sum(case a when '201301' then d else null end ) "201301销售金额" from cc group by b,c
order by b,c
create table tb
(
fmonth varchar2(50),
fcompany varchar2(50),
fcode varchar2(50),
fsalesAmount number,
fincome number
);
insert into tb values('201201','AA','001',100 ,100);
insert into tb values('201201','BB','002',200,200 );
insert into tb values('201301','AA','001',90 , 90);
insert into tb values('201301','CC','003',80 , 80); select a.fcompany,a.fcode,a.fsalesamount,a.fincome,nvl(b.fsalesamount,0) lastYearfsalesamount,nvl(b.fincome,0) lastYearfincome
from tb a
left join tb b
on to_date(a.fmonth||'01','YYYYMMDD')=add_months( to_date(b.fmonth||'01','YYYYMMDD'),12)
and a.fcompany= b.fcompany
where a.fmonth='201301'
--drop table tb;
那1#和2#的答案都废了
这个只是用作填充的,用于sum的,你只需要传入201301就可以了
那1#和2#的答案都废了看错帖子了我x
这样的写法,销售单位BB就没有了
那就把 where a.fmonth='201301' 去掉吧。
这句是限制在今年1月份的
因为bb没有今年一月份的所以结果中没有
create table TEST
(
销售日期 NUMBER,
销售单位 VARCHAR2(12),
单位代码 VARCHAR2(12),
销售量 NUMBER,
销售金额 NUMBER
);
insert into test (销售日期, 销售单位, 单位代码, 销售量, 销售金额)
values (201201, 'AA', '001', 100, 100);insert into test (销售日期, 销售单位, 单位代码, 销售量, 销售金额)
values (201201, 'BB', '002', 200, 200);insert into test (销售日期, 销售单位, 单位代码, 销售量, 销售金额)
values (201301, 'AA', '001', 90, 90);insert into test (销售日期, 销售单位, 单位代码, 销售量, 销售金额)
values (201301, 'CC', '003', 80, 80);
commit;
SELECT 销售单位,
单位代码,
SUM(销售量) 销售量,
SUM(销售金额) 销售金额,
SUM(销售量1) 销售量,
SUM(销售金额1) 销售金额
FROM (SELECT 销售日期,
销售单位,
单位代码,
SUM(销售量) 销售量,
SUM(销售金额) 销售金额,
0 销售量1,
0 销售金额1
FROM TEST
WHERE 销售日期 = '201301'
GROUP BY 销售日期, 销售单位, 单位代码
UNION ALL
SELECT 销售日期,
销售单位,
单位代码,
0 销售量,
0 销售金额,
SUM(销售量) 销售量1,
SUM(销售金额) 销售金额1
FROM TEST
WHERE 销售日期 = TO_CHAR(ADD_MONTHS(TO_DATE('201301', 'YYYYMM'), -12),
'YYYYMM')
GROUP BY 销售日期, 销售单位, 单位代码)
GROUP BY 销售单位, 单位代码;销售单位 单位代码 销售量 销售金额 销售量 销售金额
------------ ------------ ---------- ---------- ---------- ----------
CC 003 80 80 0 0
AA 001 90 90 100 100
BB 002 0 0 200 200
这样的写法,销售单位BB就没有了
那就把 where a.fmonth='201301' 去掉吧。
这句是限制在今年1月份的
因为bb没有今年一月份的所以结果中没有......那就不满足需求了