예제 #1
0
파일: tj.py 프로젝트: Gooxx/ykd
def selectNewOrderUsers(ydId,start,end):
    """本月新增下单用户数"""
    sql = f"""   SELECT o.`user_id` FROM `om_order_info` o   
                WHERE `pharmacy_id`IN ({ydId})  
                and o.order_create_time BETWEEN  '{start}'  and '{end}' 
                AND o.`order_status`= 44 and o.`order_type`= 'normal' and o.`user_id` NOT IN(  
                SELECT o1.`user_id` FROM `om_order_info` o1  
                WHERE o1.`pharmacy_id` IN ({ydId})  
                and o1.order_create_time < '{start}' 
                AND o1.`order_status`= 44 and o1.`order_type`= 'normal' GROUP BY o1.`user_id`) GROUP BY o.`user_id`  ; """
    res = querySQL(sql)
    logging.info(f"本月新增下单用户数:             人数为: {res['count']} --- 从{start} 到 {end} 在{ydId}药店下单")
    return res['count']
예제 #2
0
파일: tj.py 프로젝트: Gooxx/ykd
def selectNewOrderUsersPhoneAndOrder(ydId,start,end):
    """本月新增下单用户电话号	首次下单订单号 """
    sql = f"""SELECT u.phone_num 本月新增下单用户电话号,o.order_id 首次下单订单号 
            FROM `om_order_info` o,`um_user_info` u             
            WHERE o.user_id = u.user_id             
            and o.order_status = 44             
            and o.order_create_time BETWEEN '{start}'             
            and '{end}'             
            and o.pharmacy_id in ({ydId})             
            and o.`order_type` = 'normal'             
            and o.order_id in (               
                SELECT  min(oo.`order_id`) from om_order_info oo  
                WHERE oo.order_status = 44 and oo.pharmacy_id  in ({ydId})  and oo.`order_type` = 'normal' GROUP BY `user_id`
            )             
        ORDER BY o.`user_id`;"""
    res = querySQL(sql)
    logging.info(f"本月新增下单用户数:             人数为: {res['count']} --- 从{start} 到 {end} 在{ydId}药店下单 =={res}")
    return res['count']
예제 #3
0
파일: tj.py 프로젝트: Gooxx/ykd
def selectTYUserGrow():
    """ -- 1、天一店在20190501-20200430期间,以月为单位,每个月历史累计下过1单(不含首单)、2单(不含首单)、3单(不含首单)、4单(不含首单)、5单(不含首单)、6单(不含首单)、7单及以上(不含首单)的用户明细,以及这些用户历史首次下单的时间(年月日);
        -- 例如5月份:
        -- 1、A用户5月31日前无下单记录,在5月份当月下过1单,不统计进来;
        -- 2、A用户5月31日前无下单记录,在5月份当月下过2单,计算在1单用户中;
        -- 3、A用户5月31日前无下单记录,在5月份当月下过3单,计算在2单用户中,以此类推"""
    day = '2019-05-01'
    worksheet = workbook.add_sheet(day)
    for i in range(13):
        # nextMonth = datetime.datetime.strptime(day,'%Y-%m-%d') + relativedelta(months=+i)
        # logging.info(f"nextMonth {nextMonth}")
        # today = (datetime.datetime.strptime(day,'%Y-%m-%d')+datetime.timedelta(month=i+1)).strftime('%Y-%m-%d')
        sql = f"""  SELECT COUNT(a.dan) ds,a.dan from (
                        SELECT COUNT(o.user_id) cu
                        ,CASE WHEN COUNT(o.user_id)=1 then '0' 
                        WHEN COUNT(o.user_id)=2 then '1' 
                        WHEN COUNT(o.user_id)=3 then '2' 
                        WHEN COUNT(o.user_id)=4 then '3' 
                        WHEN COUNT(o.user_id)=5 then '4' 
                        WHEN COUNT(o.user_id)=6 then '5' 
                        WHEN COUNT(o.user_id)=7 then '6' 
                        else '7' end dan, o.user_id
                        FROM om_order_info o 
                        WHERE 
                        o.order_create_time < date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i} MONTH) 
                        and o.pharmacy_id = 200
                        and o.order_status = 44
                        GROUP BY o.user_id
                    ) a
                    GROUP BY dan ; """
        res = querySQL(sql)
        logging.info(f"天一店在20190501-20200430期间,以月为单位:{day} + {i} -- {res['data']} ---")
        for dic in res['data']:
            dan = dic['dan']
            ds = dic['ds']
            if int(dan)==0:
                worksheet.write(i,0, label = f'{day}+{i}')
            else:
                worksheet.write(i,int(dan), label = ds)
            # for (key,value) in dic:
            #     worksheet.write(i,0, label = 'this is test')
        # today = time.strftime("%Y%m%d%H%M%S", time.localtime())  # (datetime.datetime.strptime(day,'%Y-%m-%d')+datetime.timedelta(days=i+1)).strftime('%Y-%m-%d')
    workbook.save(f'{day}.xls')
예제 #4
0
파일: tj.py 프로젝트: Gooxx/ykd
def selectTYUserEachMonEachDan():
    ordersAfterThisMonth = ""
    ordersAndUsersAfterThisMonth = ""
    for i in range(1,13):
        ordersAfterThisMonth = ordersAfterThisMonth+f"""
                sum(case when 订单年月= DATE_FORMAT(date_add(o.首单时间, interval {i} MONTH),'%Y-%m') THEN 每月单数 else 0 END) as {i}月后单数 ,
                """
        ordersAndUsersAfterThisMonth = ordersAndUsersAfterThisMonth + f"""
                ,sum(case when  {i}月后单数>0  then 1 else 0 end) {i}月后用户数 
                ,sum(case when   {i}月后单数>0  then {i}月后单数 else 0 end) {i}月后用户订单数 
            """
    sql = f"""
        select count(a.`首月单数`),a.`首月单数`
        {ordersAndUsersAfterThisMonth}
        ,a.* 
        from (
                select count(o.user_id) ,
                sum(case when 订单年月= DATE_FORMAT(o.首单时间,'%Y-%m') THEN 每月单数 else 0 END) as 首月单数 ,
               {ordersAfterThisMonth}
                o.*
                from (
                    select DATE_FORMAT(a.order_create_time,'%Y-%m') 订单年月,首单时间,count(a.user_id) 每月单数,a.user_id,a.order_create_time
                    from (
                                SELECT count(o.user_id) 每个用户总单数,min(o.order_create_time) 首单时间,DATE_FORMAT(o.order_create_time,'%Y-%m') 首单年月,o.user_id 
                                from v_ty_app_44 o 
                                GROUP BY o.user_id
                                HAVING 首单时间 BETWEEN '2018-07-01 00:00:00' and '2019-06-30 23:59:59'
                        ) o left join v_ty_app_44 a on o.user_id = a.user_id 
                    GROUP BY a.user_id,订单年月
                ) as o 
                GROUP BY o.user_id
        ) a
        GROUP BY a.首月单数 
        ORDER BY a.首月单数
        ;
    """
    res = querySQL(sql)
    return res
예제 #5
0
파일: tj.py 프로젝트: Gooxx/ykd
def 分析用户每次下单间隔():
    # sql = f"""
    #     SELECT oo.*,
    #     sum(if(oo.days>=0 and oo.days<30,1,0)) '0',
    #     sum(if(oo.days>=31 and oo.days<60,1,0)) '30',
    #     sum(if(oo.days>=61 and oo.days<90,1,0)) '60',
    #     sum(if(oo.days>=91 and oo.days<120,1,0)) '90',
    #     sum(if(oo.days>=121 and oo.days<150,1,0)) '120',
    #     sum(if(oo.days>=151 and oo.days<180,1,0)) '150',
    #     sum(if(oo.days>=181 and oo.days<210,1,0)) '180',
    #     sum(if(oo.days>=211 and oo.days<240,1,0)) '210',
    #     sum(if(oo.days>=241 and oo.days<270,1,0)) '240',
    #     sum(if(oo.days>=271 and oo.days<300,1,0)) '270',
    #     sum(if(oo.days>=301 and oo.days<330,1,0)) '300',
    #     sum(if(oo.days>=331 and oo.days<366,1,0)) '330'
    #     from (
    #         select datediff(o2.order_create_time,o.order_create_time) days,o.* from 
    #         (SELECT  o.user_id,order_create_time,order_id FROM om_order_info o  
    #         where o.order_create_time between '2018-08-31' and  '2019-08-31 23:59:59'
    #         and order_status=44 and pharmacy_id =200  
    #         group by user_id) o ,
    #         (SELECT  o.user_id,order_create_time,order_id FROM om_order_info o  
    #         where o.order_create_time between '2018-08-31' and  '2020-08-31 23:59:59'
    #         and order_status=44 and pharmacy_id =200  
    #         ) o2
    #         where o.user_id = o2.user_id
    #         and o.order_id !=o2.order_id
    #     // ) oo group by oo.user_id
    # """
    # // ,o.order_create_time,o2.order_create_time
    sql = f"""
         select * from (
            select datediff(o2.order_create_time,o.order_create_time) days
                    
                    ,o.phone_num 
                    from 
                    (SELECT  o.user_id,order_create_time,order_id,u.phone_num FROM om_order_info o,um_user_info u 
                    where o.user_id = u.user_id 
                    and o.order_create_time between '2018-08-31' and  '2019-08-31 23:59:59'
                    and order_status=44 and pharmacy_id =200  
                    group by user_id) o ,
                    (SELECT  o.user_id,order_create_time,order_id FROM om_order_info o  
                    where o.order_create_time >= '2018-08-31'   
                    and order_status=44 and pharmacy_id =200  
                    ) o2
                    where o.user_id = o2.user_id
            ) a where a.days<=365;"""
    res = querySQL(sql)
    db.commit()
    list = res["data"]
    resList = []
    tempDays = 0
    tempPhone = ''
    tempRow = [0]*13
    for dic in list:
        days = dic['days']
        phone = dic['phone_num']
        if tempPhone != phone:
            resList.append(tempRow)
            tempRow = [0]*13
            tempRow[0] = phone
            tempPhone = phone
            tempDays=0
        else:
            tdays = days-tempDays
            index = int(tdays/30)+ int(0 if tdays%30==0 else 1)
            index = index if index!=0 else 1
            index = 12 if tdays>360  else index
            tempRow[index] = tempRow[index]+1
            tempDays = days
    resList.append(tempRow)
    # logging.info(f'分析用户每次下单间隔{list}')
    # logging.info(f'分析用户每次下单间隔{resList}')
    sheet = workbook.add_sheet('sheet1')
    for i in range(len(resList)):
        rows = resList[i]
        for j in range(len(rows)):
            sheet.write(i,j,rows[j])
    workbook.save('分析用户每次下单间隔2.xls')
예제 #6
0
파일: tj.py 프로젝트: Gooxx/ykd
def selectTYUserKeep():
    """ 月份	"新增
        用户数"	"1个月后
        下单
        用户数"	其中:之前下过1单的用户数	其中:之前下过2单的用户数	其中:之前下过3单的用户数	其中:之前下过4单的用户数	其中:之前下过5单的用户数	其中:之前下过6单的用户数	其中:之前下过7单的用户数	其中:之前下过8单的用户数	其中:之前下过9单的用户数	其中:之前下过10单的用户数	其中:之前下过>10单的用户数
"""
    daystr = '2019-01-01'
    day = datetime.datetime.strptime(daystr,'%Y-%m-%d')
    for j in range(16):
        for i in range(16):
            thisMonth = day+ relativedelta(months=+i)
            nextMonth = day+ relativedelta(months=+(i+1))

            afterMonth = day+ relativedelta(months=+(i+j+1))
            nextAfterMonth = day+ relativedelta(months=+(i+j+2))

            # logging.info(f"{thisMonth} {nextMonth}")
            # print(datetime.datetime.strptime(day,'%Y-%m-%d') + relativedelta(months=+i))
            # nextMonth = datetime.datetime.strptime(day,'%Y-%m-%d') + relativedelta(months=+i)
            # logging.info(f"nextMonth {nextMonth}")
            # today = (datetime.datetime.strptime(day,'%Y-%m-%d')+datetime.timedelta(month=i+1)).strftime('%Y-%m-%d')
            sql = f"""  SELECT COUNT(o.dans) yhs,o.dans from (
                        SELECT COUNT(o2.user_id) dans,o2.user_id from 
                        (
                        SELECT DISTINCT o.user_id 
                            from (
                                SELECT count(o.user_id) cuser,min(o.order_create_time) mtime,DATE_FORMAT(o.order_create_time,'%Y-%m') ym,o.user_id 
                                from v_ty_app_44 o 
                                GROUP BY o.user_id 
                                HAVING mtime BETWEEN '{thisMonth}' and '{nextMonth}' 
                                ) o 
                            ,v_ty_app_44 o1
                            WHERE o.user_id = o1.user_id 
                            and o1.order_create_time BETWEEN '{afterMonth}' and '{nextAfterMonth}'
                        ) o ,v_ty_app_44 o2 
                        WHERE o.user_id = o2.user_id 
                        and o2.order_create_time BETWEEN '{thisMonth}' and '{afterMonth}'

                        GROUP BY o2.user_id
                    ) o
                    GROUP BY o.dans; """
            res = querySQL(sql)
            # logging.info(f"  {thisMonth} + {i} + {j+1} -- {res['data']} ---")
            list = res['data']
            totleUsers = 0 # res['count']
            totleOrders = 0
            o2eOrderList=[0]*11
            for dic in list:
                # mon = thisMonth

                tmcount = dic['yhs']
                totleOrders=totleOrders+tmcount
                pastcount = dic['dans']
                totleUsers= totleUsers+pastcount*tmcount
                if int(pastcount)>10:
                    o2eOrderList[10]=o2eOrderList[10]+tmcount
                else:
                    o2eOrderList[pastcount-1]=tmcount

            # logging.info(f"{i}-{j}-{thisMonth.__format__('%Y-%m-%d')},{afterMonth.__format__('%Y-%m-%d')},{totleUsers},{totleOrders},{o2eOrderList}")
            logging.info(f"{i}-{j}-{thisMonth.__format__('%Y-%m-%d')},{afterMonth.__format__('%Y-%m-%d')},{totleUsers},{totleOrders},{','.join(o2eOrderList)}")
예제 #7
0
파일: tj.py 프로젝트: Gooxx/ykd
def selectTYThisMonthOrderUsers():
    """ 2、20190501-20200430期间,以月为单位,当月下单的老用户数(即当月下单的全部用户减去在当月下首单的用户),以及这些老用户当月产生的订单总数;"""
    day = '2019-05-01'
    # worksheet = workbook.add_sheet(day)
    for i in range(13):
        # nextMonth = datetime.datetime.strptime(day,'%Y-%m-%d') + relativedelta(months=+i)
        # logging.info(f"nextMonth {nextMonth}")
        # today = (datetime.datetime.strptime(day,'%Y-%m-%d')+datetime.timedelta(month=i+1)).strftime('%Y-%m-%d')
        # sql = f""" SELECT DATE_FORMAT(o.order_create_time,'%Y-%m') as 年月 ,COUNT(DISTINCT o.user_id) 用户数量,COUNT(o.order_id) 订单数量
        #             FROM om_order_info o 
        #             WHERE 
        #             o.order_create_time BETWEEN date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i} MONTH) and date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i+1} MONTH)
        #             and o.pharmacy_id = 200
        #             and o.order_status = 44 
        #             and   EXISTS (
        #                     SELECT * -- user_id 
        #                     from  om_order_info oi
        #                     WHERE oi.order_create_time < date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i} MONTH) 
        #                     and oi.pharmacy_id = 200
        #                     and oi.order_status = 44 
        #                     and o.user_id = oi.user_id
                    
        #             )
        #             GROUP BY 年月; """
        sql = f"""SELECT o.*,o1.*,COUNT(o.user_id) tmcount
                    from (
                    SELECT DATE_FORMAT(o.order_create_time,'%Y-%m') as 年月,DATE_FORMAT(DATE_ADD(o.order_create_time,interval -day(o.order_create_time)+1 day),'%Y-%m-%d') 年月日,o.order_id,o.user_id,o.pharmacy_id,o.order_create_time
                    FROM om_order_info o 
                    WHERE 
                    o.order_create_time BETWEEN date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i} MONTH) and date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i+1} MONTH)
                    and o.pharmacy_id = 200
                    and o.order_status = 44 ) o, 
                    (SELECT MIN(o1.order_create_time) mt,COUNT(o1.user_id) pastcount,o1.user_id
                        from  om_order_info o1 
                        where 
                        o1.pharmacy_id = 200
                        and o1.order_create_time < date_add(STR_TO_DATE('{day}', '%Y-%m-%d'),interval {i} MONTH)
                        and o1.order_status = 44
                        GROUP BY o1.user_id
                    ) o1
                    WHERE o.user_id= o1.user_id
                    GROUP BY o.user_id;""" 

        res = querySQL(sql)
        # logging.info(f"20190501-20200430期间,以月为单位,当月下单的老用户数:{day} + {i} -- {res['count']} ---")

        list = res['data']
        totleUsers = res['count']
        totleOrders = 0
        o2eOrderList=[0]*16
        # o2eOrderDic ={0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0} #{} # {'0':0,'1':0,'2':0,'3':0,'4':0,'5':0,'6':0,'7':0,'8':0}
        for dic in list:
            mon = dic['年月']

            tmcount = dic['tmcount']
            totleOrders=totleOrders+tmcount
            pastcount = dic['pastcount']
            if int(pastcount)>=8:
                # o2eOrderDic[8] = o2eOrderDic[8]+ tmcount
                o2eOrderList[8*2-2]=o2eOrderList[8*2-2]+1
                o2eOrderList[8*2-1]=o2eOrderList[8*2-1]+tmcount
            else:
                o2eOrderList[pastcount*2-2]=o2eOrderList[pastcount*2-2]+1
                o2eOrderList[pastcount*2-1]=o2eOrderList[pastcount*2-1]+tmcount
                # o2eOrderDic[pastcount] = o2eOrderDic[pastcount]+tmcount

        logging.info(f"{mon},{totleUsers},{totleOrders},{o2eOrderList}")