前两天有事情 停了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多个条件以什么表当做主条件表_20161111周五的更多相关文章

  1. SQL学习:主键,外键,主键表,外键表,数据库的表与表之间的关系;

    在数据库的学习中,对于一个表的主键和外键的认识是非常重要的. 主键:在一个表中,能唯一的表示一个事物(或者一条记录)的字段,我们称之为主键 注意: 主键的设置可以不只是用一个字段,也可以用若干个字段的 ...

  2. 三十一.MySQL存储引擎 、 数据导入导出 管理表记录 匹配条件

    1.MySQL存储引擎的配置 查看服务支持的存储引擎 查看默认存储类型 更改表的存储引擎 设置数据库服务默认使用的存储引擎 1.1 查看存储引擎信息 mysql> SHOW ENGINES\G ...

  3. MySQL表的创建和表中数据操作

    这篇文章主要介绍在navicat的命令界面操作mysql.主要涉及建立表结构,和对表中数据的增加删除修改查询等动作.站在一个新手角度的简单mysql表结构和数据操作. ☆ 准备工作 1,保证自己的电脑 ...

  4. mysql复制表数据或表结构到新表中

    MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制表结构到新表 C ...

  5. mysql 从5.1升级到5.5.33 后 innodb 表出错 及 innodb表修复

    服务器使用的是mysql 5.1,了解到 5.5 系列的版本 innodb 的性能有很大提升,就想升级下.按照查到的步骤: http://www.myhack58.com/Article/sort09 ...

  6. MySQL 复制表到另一个表

    1.复制表结构及数据到新表 create table 新表 select * from 旧表 2.只复制表结构到新表 方法1:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已 ...

  7. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  8. MySQL用sql复制表数据到新表的方法

    用sqlyog无法直接复制出一个不同表名的表来,只能copy到其他库上同名的表. 在MySQL数据库中,应该如何用sql将表数据复制到新表中呢? 本人通过试验测试成功了,而且相当简单易懂,速度也非常快 ...

  9. MySQL中不允许使用列别名作为查询条件

    在MySQL中有个特殊的规定,即不允许使用列别名作为查询条件.比如有下面一个表: select     ID,     title,     concept,     conceptLength,   ...

随机推荐

  1. java和C#实例化类初始化顺序

    c# 初始化顺序 子类的静态字段 子类的静态构造方法 子类的实例字段 父类的静态字段 父类的静态构造方法 父类的实例字段 父类的实例构造方法 java 初始化顺序 初始化过程: 1. 初始化父类中的静 ...

  2. Redis专题(2):Redis数据结构底层探秘

    前言 上篇文章Redis闲谈(1):构建知识图谱介绍了redis的基本概念.优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识.互联网的很多应用场景都有着Redis的身影,它能做的事情远远 ...

  3. 有关Cache –(1) linux list之中的Prefetc

    转载:http://www.kernelchina.org/node/1050 linux的list实现之中有如下东东: #define list_for_each(pos, head) \     ...

  4. 【Atheros】禁用CSMA之后pktgen发包一分钟后无法发送的问题

    无线网络中各个节点不断地广播信标帧,收到某节点的信标帧之后才知道这个节点存在,知道它的网络配置是怎么样的,才能知道应该怎么和它通信. 那么问题来了,禁用了CSMA之后,发送节点全力发送,那么它会永远占 ...

  5. DataGrid绑定Dictionary问题

    问题] 在最近的项目中使用DataGrid的DataGridCheckBoxColumn绑定了后台TagModel类的IsSelected字段,数据源是TagModel类型的Dictionary,运行 ...

  6. Python中类方法、__new__方法和__init__方法解析

    在编程语言中创建一个类,有构造方法这样的一个术语.而在Python中,通常大家都认为__init__是构造方法,其实并不完全等同.在构建类中,有一个特殊的方法__new__,这个才能等同为构造方法. ...

  7. 使用jQuery Ajax功能的时候需要注意的一个问题

    每次jquery的Ajax请求都会创建一个xmlHttprequest对象,理论上讲,长连接(页面需要和服务器保持长连接,而且在连接超时后需要重新请求连接)的请求是一个无限递归,请求数量是非常大的,但 ...

  8. 九度OJ 1173:查找 (排序、查找)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5808 解决:3163 题目描述: 输入数组长度 n  输入数组      a[1...n]  输入查找个数m  输入查找数字b[1...m ...

  9. php加速器: xcache

    1.准备软件包 xcache-3.2.0.tar.gz 2.安装组件 $ echo 'export LC_ALL=C' >> /etc/profile $ tail -l /etc/pro ...

  10. 【题解】[P3557 POI2013]GRA-Tower Defense Game

    [题解][P3557 POI2013]GRA-Tower Defense Game 这道题是真的** 根据题目给的\(k\),可以知道,我们随便放塔,只要不全放一起,一定是一种合法的方案. 直接枚举就 ...