请教一个SQL查询的问题

特能输 2013-09-16 03:31:36
测试表及数据是这样:
销售日期 销售单位 单位代码 销售量 销售金额
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

这样表述不知道是否清楚,表头是随便取的,主要是达到这么个需求
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
特能输 2013-09-18
  • 打赏
  • 举报
回复
引用 12 楼 stublue 的回复:
[quote=引用 7 楼 leonaya 的回复:] [quote=引用 4 楼 stublue 的回复:]

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;

这样的写法,销售单位BB就没有了[/quote] 那就把 where a.fmonth='201301' 去掉吧。 这句是限制在今年1月份的 因为bb没有今年一月份的所以结果中没有[/quote] ......那就不满足需求了
无敌小二傻 2013-09-16
  • 打赏
  • 举报
回复

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
Leon_He2014 2013-09-16
  • 打赏
  • 举报
回复
引用 7 楼 leonaya 的回复:
[quote=引用 4 楼 stublue 的回复:]

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;

这样的写法,销售单位BB就没有了[/quote] 那就把 where a.fmonth='201301' 去掉吧。 这句是限制在今年1月份的 因为bb没有今年一月份的所以结果中没有
u010412956 2013-09-16
  • 打赏
  • 举报
回复
引用 9 楼 u010412956 的回复:
[quote=引用 5 楼 leonaya 的回复:] [quote=引用 3 楼 u010412956 的回复:] 楼主 要问的 应该是 行转不定列吧,也就是说 销售日期 、 销售单位 是不确定的???
你所说的行转不定列是什么意思,不太明白[/quote] 也就是说我如果再加一条记录; 201305 CCC 003 800 800 那1#和2#的答案都废了[/quote] 看错帖子了。。。我x
无敌小二傻 2013-09-16
  • 打赏
  • 举报
回复
引用 8 楼 leonaya 的回复:
[quote=引用 1 楼 lyliu602 的回复:]

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
请问 “0 销售量1, 0 销售金额1” 这个是什么意思 [/quote] 这个只是用作填充的,用于sum的,你只需要传入201301就可以了
u010412956 2013-09-16
  • 打赏
  • 举报
回复
引用 5 楼 leonaya 的回复:
[quote=引用 3 楼 u010412956 的回复:] 楼主 要问的 应该是 行转不定列吧,也就是说 销售日期 、 销售单位 是不确定的???
你所说的行转不定列是什么意思,不太明白[/quote] 也就是说我如果再加一条记录; 201305 CCC 003 800 800 那1#和2#的答案都废了
特能输 2013-09-16
  • 打赏
  • 举报
回复
引用 1 楼 lyliu602 的回复:

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
请问 “0 销售量1, 0 销售金额1” 这个是什么意思
特能输 2013-09-16
  • 打赏
  • 举报
回复
引用 4 楼 stublue 的回复:

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;

这样的写法,销售单位BB就没有了
driftrabbit 2013-09-16
  • 打赏
  • 举报
回复
select * from 销售表 WHERE 销售日期 in (to_date('2012-2-1','yyyy-mm-dd'),to_date('2013-2-1','yyyy-mm-dd'))
特能输 2013-09-16
  • 打赏
  • 举报
回复
引用 3 楼 u010412956 的回复:
楼主 要问的 应该是 行转不定列吧,也就是说 销售日期 、 销售单位 是不确定的???
你所说的行转不定列是什么意思,不太明白
Leon_He2014 2013-09-16
  • 打赏
  • 举报
回复

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;

u010412956 2013-09-16
  • 打赏
  • 举报
回复
楼主 要问的 应该是 行转不定列吧,也就是说 销售日期 、 销售单位 是不确定的???
tannel 2013-09-16
  • 打赏
  • 举报
回复
with cc as (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
无敌小二傻 2013-09-16
  • 打赏
  • 举报
回复

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

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧