近期要做佣金报表,遇到一个统计问题,写下来请各位指教一下
现在有个佣金奖励表,是根据销售明细整理出来的,当销售单数量两对以上(包含两对)奖励10元/单,当销售单数量三对以上(包含三对)额外再奖励5元/单,销售单号   店员代号   销售数量  两对佣金   两对以上佣金
00001     001      2        10        0
00002     001      3        10        5
00003     002      4        10        5
00004     001      5        10        5
00005     002      2        10        0
......要求输出的报表格式如下店员代号   两对佣金总和  两对单据数量    两对以上佣金总和   两对以上单据数量
001       30          3             10               2
002       20          2             5                1我是采用左连接的办法来处理的select a.店员代号,a.两对佣金总和,a.两对单据数量,b.两对以上佣金总和,b.两对以上单据数量级 from (
select 店员代号,count(两对佣金) 两对佣金总和,sum(销售单号) 两对单据数量 from 佣金奖励表  where 销售数量>1 group by 店员代号) a,
select 店员代号,count(两对佣金) 两对以上佣金总和,sum(销售单号) 两对以上单据数量 from 佣金奖励表  where 销售数量>2 group by 店员代号) b
on a.店员代号=b.店员代号我觉得这样处理很笨,但局限于自己所学有限,又想不出更好的办法,请问各位大虾有没更好的办法呢?多谢指教!

解决方案 »

  1.   

    create table tb(销售单号 varchar(10),店员代号 varchar(10), 销售数量 int, 两对佣金 int, 两对以上佣金 int)
    insert into tb values('00001' ,   '001' ,     2 ,       10  ,      0) 
    insert into tb values('00002' ,   '001' ,     3 ,       10  ,      5) 
    insert into tb values('00003' ,   '002' ,     4 ,       10  ,      5) 
    insert into tb values('00004' ,   '001' ,     5 ,       10  ,      5) 
    insert into tb values('00005' ,   '002' ,     2 ,       10  ,      0) 
    goselect 店员代号,
           两对佣金总和 = sum(两对佣金) ,
           两对单据数量 = count(1),
           两对以上佣金总和 = sum(两对以上佣金),
           两对以上单据数量 = count(1) - 1
    from tb
    group by 店员代号drop table tb/*
    店员代号       两对佣金总和      两对单据数量      两对以上佣金总和    两对以上单据数量    
    ---------- ----------- ----------- ----------- ----------- 
    001        30          3           10          2
    002        20          2           5           1(所影响的行数为 2 行)
    */
      

  2.   

    select 
        店员代号,
        两对佣金总和=sum(两对佣金),
        两对单据数量=count(1),
        两对以上佣金总和=sum(两对以上佣金),
        两对以上单据数量级=sum(case when 两对以上佣金 = 0 then 0 else 1 end)
    from 佣金奖励表
    group by 店员代号
      

  3.   

    --不是特别明白你最后一个数据的算法,是按照除2来算,还是?create table tb(销售单号 varchar(10),店员代号 varchar(10), 销售数量 int, 两对佣金 int, 两对以上佣金 int)
    insert into tb values('00001' ,   '001' ,     2 ,       10  ,      0) 
    insert into tb values('00002' ,   '001' ,     3 ,       10  ,      5) 
    insert into tb values('00003' ,   '002' ,     4 ,       10  ,      5) 
    insert into tb values('00004' ,   '001' ,     5 ,       10  ,      5) 
    insert into tb values('00005' ,   '002' ,     2 ,       10  ,      0) 
    goselect 店员代号,
           两对佣金总和 = sum(两对佣金) ,
           两对单据数量 = count(1),
           两对以上佣金总和 = sum(两对以上佣金),
           两对以上单据数量1 = count(1) - 1,
           两对以上单据数量2 = CEILING(count(1)*1.0/2)
    from tb
    group by 店员代号drop table tb/*店员代号       两对佣金总和      两对单据数量      两对以上佣金总和    两对以上单据数量1   两对以上单据数量2            
    ---------- ----------- ----------- ----------- ----------- -------------------- 
    001        30          3           10          2           2
    002        20          2           5           1           1(所影响的行数为 2 行)
    */
      

  4.   

    大虾们,好像不对哦,还是我没表述清楚呢,当改变一下条件:
    create table tb(销售单号 varchar(10),店员代号 varchar(10), 销售数量 int, 两对佣金 int, 两对以上佣金 int)
    insert into tb values('00001' ,   '001' ,     2 ,       10  ,      0) 
    insert into tb values('00002' ,   '001' ,     2 ,       10  ,      5) 
    insert into tb values('00003' ,   '001' ,     4 ,       10  ,      5) 
    insert into tb values('00004' ,   '001' ,     5 ,       10  ,      5) 
    insert into tb values('00005' ,   '002' ,     2 ,       10  ,      0) 
    goselect 店员代号,
           两对佣金总和 = sum(两对佣金) ,
           两对单据数量 = count(1),
           两对以上佣金总和 = sum(两对以上佣金),
           两对以上单据数量1 = count(1) - 1,
           两对以上单据数量2 = CEILING(count(1)*1.0/2)
    from tb
    group by 店员代号出来的结果是
    店员代号  两对佣金总和 两对单据数量  两对以上佣金总和  两对以上单据数量
    001 40 4 15 3
    002 10 1 0 0要想要的结果是
    店员代号  两对佣金总和 两对单据数量  两对以上佣金总和  两对以上单据数量
    001 40 4 10 2
    002 10 1 0 0
      

  5.   

    借用5楼的数据,不知以下是不是楼主想要的结果create table tb(销售单号 varchar(10),店员代号 varchar(10), 销售数量 int, 两对佣金 int, 两对以上佣金 int)
    insert into tb values('00001' ,  '001' ,    2 ,      10  ,      0)
    insert into tb values('00002' ,  '001' ,    2 ,      10  ,      5)
    insert into tb values('00003' ,  '001' ,    4 ,      10  ,      5)
    insert into tb values('00004' ,  '001' ,    5 ,      10  ,      5)
    insert into tb values('00005' ,  '002' ,    2 ,      10  ,      0)
    goselect 店员代号,
          两对佣金总和 = sum(两对佣金) ,
          两对单据数量 = count(1),
          两对以上佣金总和 = case when count(1)>2 then sum(两对以上佣金)-5 else 0 end,
          两对以上单据数量 = case when count(1)>2 then CEILING(count(1)*1.0-2) else 0 end
    from tb
    group by 店员代号 drop table tb
      

  6.   

    表自己生成吧!
    select 店员代号,
          两对佣金总和 = sum(两对佣金) ,
          两对单据数量 = count(1),
          两对以上佣金总和 = sum(case when 销售数量>2 then 两对以上佣金 else 0 end),
          两对以上单据数量 = sum(case when 销售数量>2 then 1 else 0 end)
    from tb
    where 销售数量>1
    group by 店员代号 
      

  7.   

    测试过了,taoistong 正解,非常感谢