测试表及数据是这样:
销售日期   销售单位  单位代码   销售量   销售金额
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这样表述不知道是否清楚,表头是随便取的,主要是达到这么个需求

解决方案 »

  1.   


    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
      

  2.   

    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
      

  3.   


    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;
      

  4.   

    select * from 销售表 WHERE 销售日期 in (to_date('2012-2-1','yyyy-mm-dd'),to_date('2013-2-1','yyyy-mm-dd'))
      

  5.   

    你所说的行转不定列是什么意思,不太明白也就是说我如果再加一条记录;201305    CCC          003         800           800
    那1#和2#的答案都废了
      

  6.   

    请问 “0 销售量1, 0 销售金额1” 这个是什么意思
    这个只是用作填充的,用于sum的,你只需要传入201301就可以了
      

  7.   

    你所说的行转不定列是什么意思,不太明白也就是说我如果再加一条记录;201305    CCC          003         800           800
    那1#和2#的答案都废了看错帖子了我x
      

  8.   


    这样的写法,销售单位BB就没有了
    那就把 where a.fmonth='201301' 去掉吧。
    这句是限制在今年1月份的
    因为bb没有今年一月份的所以结果中没有
      

  9.   


    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
      

  10.   


    这样的写法,销售单位BB就没有了
    那就把 where a.fmonth='201301' 去掉吧。
    这句是限制在今年1月份的
    因为bb没有今年一月份的所以结果中没有......那就不满足需求了