zoukankan      html  css  js  c++  java
  • MySQL多个条件以什么表当做主条件表_20161111周五

    前两天有事情 停了2天

    数据需求:
    1、活动日期11.8-11.10订单
    2、单笔订单购买A类产品 B类产品满足68元、且连续3天下单的用户ID

    首先第一个条件很简单,主要是第二个条件 第二个条件是 且 逻辑运算

    并且计算每个字段维度也不一样,单笔订单购买A、B 满足68 这个情况包含一个用户一天下多个订单 这个是一个用户多条记录的情况 我称之为多对一

    第二个条件 连续3天下单的用户ID 这个是一对一的记录 一行一条记录 是一个用户对应这三天的下单天数总计 我称之为一对一

    第一种呈现方式:我想呈现的是这样的一个表包含下面一个字段

    一个用户,下单天数,三天每一天的金额(符合单笔订单AB和>=68,因此需要一个最细的明细 一个订单具体到每个产品去的原始明细 这样看起来比较清晰 这个展现的过程是把单笔订单满足条件的用户先筛选出来 然后再去判断他的下单天数

    a3表having 已经对用户ID 进行了单笔订单满足条件的控制 然后下面就是计算下单天数 因为一天可能会出现多个订单 所以需要再进行一次对用户 和 订单日期的Group by 

    最后计算count(订单日期)  天数 按照天数降序 以group by 用户 结束  把用户中符合单笔条件的下单天数计算出来 再去判断就可以把用户找出来

    这样表的结果也是一对一 一个用户一行记录

    SELECT 城市,用户ID,用户名称,SUM(金额) AS 3天总金额,COUNT(订单日期) AS 下单天数,SUM(IF(订单日期='2016-11-08',AB金额和,NULL)) AS 8日AB金额和,SUM(IF(订单日期='2016-11-09',AB金额和,NULL)) AS 9日AB金额和,SUM(IF(订单日期='2016-11-10',AB金额和,NULL)) AS 10日AB金额和
    FROM (
        SELECT 城市,用户ID,用户名称,订单日期,SUM(金额) AS 金额,SUM(AB金额和) AS AB金额和,SUM(A金额) AS A金额,SUM(B金额) AS B金额
        FROM (
            SELECT 城市,用户ID,用户名称,订单日期,订单ID,SUM(金额) AS 金额,(SUM(IF(产品分类="A",金额,0))+SUM(IF(产品分类="B",金额,0))) AS AB金额和,SUM(IF(产品分类="A",金额,NULL)) AS A金额    ,SUM(IF(产品分类="B",金额,NULL)) AS B金额
            FROM(
                SELECT 城市,用户ID,用户名称,DATE(订单日期) AS 订单日期,`订单ID`,a1.`产品ID`,a1.`产品名称`,`产品分类`,`金额`
                FROM `a003_order` AS a1
                LEFT JOIN `a002_sku` AS a2 ON a1.产品ID=a2.产品ID
                WHERE 城市='济南' AND 订单日期>="2016-11-08" AND 订单日期<"2016-11-11" AND 金额>0 
            ) AS a3
            GROUP BY 订单ID
            HAVING (SUM(IF(产品分类="A",金额,0))+SUM(IF(产品分类="B",金额,0)))>=68
            ORDER BY 用户ID
        ) AS a
        GROUP BY 用户ID,订单日期
    ) AS b
    GROUP BY 用户ID
    ORDER BY COUNT(订单日期) DESC 

    第二种呈现方式:我先把所有用户在这3天中的汇总情况计算出来,一个用户一行记录,下单天数,下定单总数,3天A的总额,B的总额,AB总额和,这个是主表

    最后再去判断这些用户 哪些是单笔订单满足68的的用户 当做从表 left join 主表 以用户相同为条件 

    这两个表都是一对一的表 都从用户为角度出发 

    SELECT a.*,b.标识
    FROM (#以用户ID汇总 一对一 3天内所有下单的用户
        SELECT 城市,用户ID,COUNT(订单日期) AS 下单天数,SUM(订单数) AS 订单数,SUM(AB金额和) AS AB金额和,SUM(A金额) AS A金额,SUM(B金额) AS B金额
        FROM (
            SELECT 城市,用户ID,订单日期,COUNT(订单ID) AS 订单数,SUM(AB金额和) AS AB金额和,SUM(A金额) AS A金额,SUM(B金额) AS B金额
            FROM (
                SELECT 城市,用户ID,DATE(订单日期) AS 订单日期,订单ID,SUM(金额) AS 订单总额
                ,(SUM(IF(a2.产品分类="A",金额,0))+SUM(IF(a2.产品分类="B",金额,0))) AS AB金额和
                ,SUM(IF(a2.产品分类="A",金额,NULL)) AS A金额
                ,SUM(IF(a2.产品分类="B",金额,NULL)) AS B金额
                FROM `a003_order` AS a1
                LEFT JOIN `a002_产品` AS a2 ON a1.产品ID=a2.产品ID
                WHERE 城市='济南' AND 订单日期>="2016-11-08" AND 订单日期<"2016-11-11" AND 金额>0 AND 用户ID=44825
                GROUP BY 订单ID
            ) AS a3
            GROUP BY 用户ID,订单日期
        ) AS a4
        GROUP BY 用户ID
    ) AS a
    LEFT JOIN (#取出AB和单笔订单>=68的用户订单 一对一
        SELECT b3.*
        FROM (#订单ID明细 一个用户对应多个订单ID 一对多
            SELECT 城市,用户ID,DATE(订单日期) AS 订单日期,订单ID,SUM(金额) AS 订单总额
            ,(SUM(IF(b2.产品分类="A",金额,0))+SUM(IF(b2.产品分类="B",金额,0))) AS AB金额和
            ,SUM(IF(b2.产品分类="A",金额,NULL)) AS A金额
            ,SUM(IF(b2.产品分类="B",金额,NULL)) AS B金额
            ,CASE WHEN (SUM(IF(b2.产品分类="A",金额,0))+SUM(IF(b2.产品分类="B",金额,0)))>=68 THEN "3天内有单笔订单>=68" ELSE NULL END AS 标识
            FROM `a003_order` AS b1
            LEFT JOIN `a002_产品` AS b2 ON b1.产品ID=b2.产品ID
            WHERE 城市='济南' AND 订单日期>="2016-11-08" AND 订单日期<"2016-11-11" AND 金额>0 AND 用户ID=44825
            GROUP BY 订单ID
            ORDER BY (SUM(IF(b2.产品分类="A",金额,0))+SUM(IF(b2.产品分类="B",金额,0))) DESC
        ) AS b3
        WHERE 标识 IS NOT NULL
        GROUP BY 用户ID
    ) AS b ON a.用户ID=b.用户ID
  • 相关阅读:
    MYSQL EXPLAIN 执行计划详解
    MAC idea 快捷键
    mysql decimal类型与decimal长度用法详解
    docker zookeeper 集群搭建
    docker redis4.0 集群(cluster)搭建
    SSH登录问题 .ssh/known_hosts和 ECDSA key
    docker常用命令
    Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录?
    IoC基础篇(一)--- Spring容器中Bean的生命周期
    Maven实战(六)--- dependencies与dependencyManagement的区别
  • 原文地址:https://www.cnblogs.com/Mr-Cxy/p/6055240.html
Copyright © 2011-2022 走看看