1.业务背景:组合促销。向商品表插入6种商品。
代码 名称 价格(元) 单位
1001 五香瓜子 8.80 袋
1002 奶香瓜子 8.80 袋
1003 原味瓜子 7.60 袋
1101 菲律宾芒果干 10.20 袋
1102 越南椰片 8.60 袋
1103 泰国芒果冰 10.00 袋
单位都为个(袋装)。组的概念:组内每个商品都买一个,即可归为一组。比如1001买了5个,1002买了3个,1003买了2个,那么这个只能称为2组。一笔流水当含有所有促销组商品时才能为实行了组合促销,可能也包含多种组合(比如上面的6种商品都在一个流水里,则人为此但含有A,B2个组合促销)。
要求:统计某一段时间内促销组的销售情况。门店代码 门店名称 A组销售金额:1001,1002,1003 B组销售金额:1101,1102,1103

PS:此为LPPZ最近的一个报表需求,如有不懂可以在群里问。需要模拟向流水表和明细表插入模拟数据。
create table buy (--销售流水表(BUY):
flowno     varchar2(20), --销售流水号  201307010001
posno      varchar2(8),  --收银机代码  c100101 1
emp        varchar2(8),  --收银员代码
amt        number(8,2),  --应收金额
realamt    number(8,2),  --实收金额
realnum    number(8,3), -- 商品数量 m
fildate    date,         --记录时间
sgid       number(8),   --门店id
);
create table buy2(-- 销售明细表(BUY2):
flowno     varchar2(20), --销售流水号
gcode      varchar2(8),  --商品代码
grpc       number(8,2), --商品零售价
gnum       number(8,3),  --购物商品数量
amt        number(8,2),  --应收金额
realamt    number(8,2),  --实收金额
);
create table goods(
       gcode number,
       gname varchar2(50),
       price number(7,2),
       unit varchar2(10)
);
create table store(--门店表
       sgid number(8),     --门店ID
       scode varchar(10),  --门店代码
       sname varchar(50),  --门店名称
       slv number(1)      --门店等级 1-5
);
insert into goods values(1001,'五香瓜子',8.80,'袋');
insert into goods values(1002,'奶香瓜子',8.80,'袋');
insert into goods values(1003,'原味瓜子',7.6,'袋');
insert into goods values(1101,'菲律宾芒果干',10.2,'袋');
insert into goods values(1102,'越南椰片',8.60,'袋');
insert into goods values(1103,'泰国芒果冰',10,'袋');
commit;oracle

解决方案 »

  1.   

    可以从buy2表的amt        number(8,2),  --应收金额
    realamt    number(8,2),  --实收金额
    入手,组合促销应该有个促销比率
    select sum(a) from(
    select sum(realamt) a from buy2 where gcode='10001' and amt/realamt=a and flowno in (select flowno from buy where date between date1 and date2) union all
    select sum(realamt) b from buy2 where gcode='10002' and amt/realamt=b and flowno in (select flowno from buy where date between date1 and date2) union all
    select sum(realamt) b  from buy2 where gcode='10003' and amt/realamt=c and flowno in (select flowno from buy where date between date1 and date2))
      

  2.   

    我不清楚金额怎么统计,我用的是销售量乘以价格。select e.scode,e,sname,d.sumA * (8.8+8.8+7.6) ,d.sumB * (10.2+8.6+10)
    from 
     (
      select c.sgid,sum(c.cntA) sumA,sum(c.cntB) sumB
      from
      (
       select 
        (select nvl(min(a.gnum) , 0) from buy2 a where a.gcode in (1001,1002,1003) and a.flowno = b.flowno group by a.flowno) cntA,
        (select nvl(min(a.gnum) , 0) from buy2 a where a.gcode in (1101,1102,1103) and a.flowno = b.flowno group by a.flowno) cntB,
        b.flowno flowno,
        b.sgid sgid,
       from (select flowno,sgid from buy where fildate between date1 and date2 group by sgid,flowno) b
       ) c
     ) d,
     store e
    where d.sgid = e.sgid