orders表中有
orderid:订单唯一标识号,
departmentid:部门唯一标识,
corpid:企业顾客唯一标识
orderamount:客户下单金额,
createtime:订单创建日期,根据起止日期,统计的字段信息如下:
部门、首次下单客户总数、首次下单的总单数、首次下单的总金额、总单数、总订单金额。注意:
首次下单客户总<首次下单的总单数:会出现很早以前的客户,在起止日期内下了多单。
若存在顾客在起止日期范围内,在不同的部门下单,则计入第一次下单的部门我在统计首次下单这里找不到好的处理办法,请教各位。

解决方案 »

  1.   

       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  2.   

    环境:mysql5.6
    数据格式如下:
    create table tmpOrders
    (
    orderid int,
    departmentid int,
    corpid int,
    orderamount DECIMAL(10,2),
    createtime datetime
    );
    insert into tmpOrders  values(12,3,999,100.00,'2016-03-10 12:53:23');
    insert into tmpOrders  values(23,2,444,158.00,'2016-06-07 20:42:23');
    insert into tmpOrders  values(43,3,777,200.00,'2016-06-14 18:20:45');
    insert into tmpOrders  values(78,6,555,100.00,'2016-06-23 15:56:23');
    insert into tmpOrders  values(34,3,333,42.00,'2016-06-10 12:20:23');
    insert into tmpOrders  values(22,2,111,300.00,'2016-06-08 14:20:23');
    insert into tmpOrders  values(13,6,444,100.00,'2016-06-12 09:11:33');想得到的结果如下:
    开始时间:2016-06-01;截止时间:2016-06-30
    部门   客户首次下单总数    首次下单的总金额    总单数     总订单金额
    3         2             242                  2            242
    2         2             458                   2           458
    6         1                              100                             1              100
    注:若在统计时间范围内存在第一次下单,并且是多次,则将第一次下单的统计到首次下单的部门,其它时间内的下单的不做统计
      

  3.   

    mysql> select * from tmpOrders;
    +---------+--------------+--------+-------------+---------------------+
    | orderid | departmentid | corpid | orderamount | createtime          |
    +---------+--------------+--------+-------------+---------------------+
    |      12 |            3 |    999 |      100.00 | 2016-03-10 12:53:23 |
    |      23 |            2 |    444 |      158.00 | 2016-06-07 20:42:23 |
    |      43 |            3 |    777 |      200.00 | 2016-06-14 18:20:45 |
    |      78 |            6 |    555 |      100.00 | 2016-06-23 15:56:23 |
    |      34 |            3 |    333 |       42.00 | 2016-06-10 12:20:23 |
    |      22 |            2 |    111 |      300.00 | 2016-06-08 14:20:23 |
    |      13 |            6 |    444 |      100.00 | 2016-06-12 09:11:33 |
    +---------+--------------+--------+-------------+---------------------+
    7 rows in set (0.00 sec)mysql> select departmentid,count(*),sum(orderamount),count(*),sum(orderamount)
        -> from tmpOrders t
        -> where createtime between '2016-06-01' and '2016-06-30 23:59:59'
        -> and not exists (
        ->  select 1 from
        ->  tmpOrders
        ->  where createtime >= '2016-06-01'
        ->  and corpid=t.corpid
        ->  and createtime<t.createtime)
        -> group by departmentid;
    +--------------+----------+------------------+----------+------------------+
    | departmentid | count(*) | sum(orderamount) | count(*) | sum(orderamount) |
    +--------------+----------+------------------+----------+------------------+
    |            2 |        2 |           458.00 |        2 |           458.00 |
    |            3 |        2 |           242.00 |        2 |           242.00 |
    |            6 |        1 |           100.00 |        1 |           100.00 |
    +--------------+----------+------------------+----------+------------------+
    3 rows in set (0.00 sec)mysql>
      

  4.   

    谢版主,后面的统计错了。
    部门6的在算6月份总订单数就不对了,应该是2笔,总金额是400。
    这个统计麻烦就是在即统计新客户下单,又要统计时间范围内的总订单数及金额,就卡在这里的。期望的结果是如下:
    +--------------+----------+------------------+----------+------------------+
    | departmentid | count(*) | sum(orderamount) | count(*) | sum(orderamount) |
    +--------------+----------+------------------+----------+------------------+
    |            2 |        2 |           458.00 |        2 |           458.00 |
    |            3 |        1 |           200.00 |        2 |           242.00 |
    |            6 |        1 |           100.00 |        2 |           200.00 |
    +--------------+----------+------------------+----------+------------------+
    3 rows in set (0.00 sec)
      

  5.   

    版主给出的方法能可以得到首单的数据。要得附加上总数据,笨办法是在先得到总数据,再inner join。版主的方法很简洁,学习了。用子查询也拼接出了结果,但拼接的想吐。
      

  6.   

    select corpid,金额 as 首单金额
    from (
            select  corpid,sum(orderamount) as 金额
            from orders as A 
            group by corpid,date(createtime) 
           order by corpid,date(createtime)
    ) as b # b表根据企业客户 订单日期group by 同时根据这两个字段升序 形成一个子表 然后从子表只依据企业客户group by 取首单
    group by corpid
      

  7.   


    select corpid,订单日期 as 首单日期,金额 as 首单金额
    from (
            select  corpid,date(createtime) as 订单日期,sum(orderamount) as 金额
            from orders as A 
            group by corpid,date(createtime) 
           order by corpid,date(createtime)
    ) as b # b表根据企业客户 订单日期group by 同时根据这两个字段升序 形成一个子表 然后从子表只依据企业客户group by 取首单
    group by
    corpid