Mysql中使用Union—多表合并之行合并

 更新时间:2023年07月03日 11:20:51   作者:榴莲小冰棍  
这篇文章主要介绍了Mysql中使用Union—多表合并之行合并,如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字,union(或称为联合)的作用是将多个结果合并在一起显示出来,需要的朋友可以参考下

Union (all)语句格式

select 列名    from 表A

union (all)

select 列名    from 表B

注意事项:

  • 合并的表的列数必须是一致的,也就是表的列数要相同
  • union 与union all 对两个查询结果合并的时候,如果结果有重复,union 会把重复的值删除;
  • union 与union all不能与order by同时使用,如果要对结果进行排序,可以用子查询

案例解析

统计20170703—20170709周内每天及本周累计销售金额、订单量、会员数、订单占比

  • 统计时间段内每天的累计销售金额、订单量、会员数
  • 统计本周累计销售金额、订单量、会员数
  • 订单占比
  • union合并表
  • 对比 union all合并表——因为没有重复数据,所以两表合并结果一样
-- 1、统计时间段内每天的累计销售金额、订单量、会员数
SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
      ,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
-- 2、统计本周累计销售金额、订单量、会员数
SELECT SUM(AMT) as total_money
      ,COUNT(DISTINCT salesID) as total_num_order
      ,COUNT(DISTINCT dimMemberID) total_num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0;
-- 3、订单占比
SELECT DATE_FORMAT(dimDateID,'%W') AS week_1
      ,CONCAT(ROUND( COUNT(DISTINCT salesID)/(SELECT COUNT(DISTINCT salesID)
                                FROM dw.fct_sales
                                where dimDateID between '20170703' and '20170709'
                                and dimMemberID <>0),4)*100,'%') as order_rate
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
-- 4、union合并表
SELECT DATE_FORMAT(dimDateID,'%W') AS week_1 
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order
      ,COUNT(DISTINCT dimMemberID) num_member
      ,CONCAT(ROUND( COUNT(DISTINCT salesID)/(
       SELECT COUNT(DISTINCT salesID)
       FROM dw.fct_sales
       where dimDateID between '20170703' and '20170709'
       and dimMemberID <>0),4)*100,'%') as order_rate
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION 
SELECT week(dimDateID,1)               /*为了保证列数一样,week返回日期为一年中的第几周 weel(date,1):从周一开始为第一天*/
      ,SUM(AMT) as total_money
      ,COUNT(DISTINCT salesID) as total_num_order
      ,COUNT(DISTINCT dimMemberID) total_num_member
      ,'100%' as total                 /*为确保列数一样*/
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by week(dimDateID,1);            /*出现汇总函数需要进行分组*/
-- 5、对比 union all合并表——因为没有重复数据,所以两表合并结果一样
SELECT DATE_FORMAT(dimDateID,'%W') AS week_1 
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order
      ,COUNT(DISTINCT dimMemberID) num_member
      ,CONCAT(ROUND( COUNT(DISTINCT salesID)/(
       SELECT COUNT(DISTINCT salesID)
       FROM dw.fct_sales
       where dimDateID between '20170703' and '20170709'
       and dimMemberID <>0),4)*100,'%') as order_rate
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION ALL 
SELECT week(dimDateID,1)               /*为了保证列数一样,week返回日期为一年中的第几周 weel(date,1):从周一开始为第一天*/
      ,SUM(AMT) as total_money
      ,COUNT(DISTINCT salesID) as total_num_order
      ,COUNT(DISTINCT dimMemberID) total_num_member
      ,'100%' as total                 /*为确保列数一样*/
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by week(dimDateID,1);            /*出现汇总函数需要进行分组*/
区分union 和 union all ,利用重复数据对比,合并两个一模一样的表 
-- union
SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
      ,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION 
SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
      ,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
-- union all
SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
      ,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION ALL 
SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
      ,SUM(AMT) as money
      ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
      ,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
多表合并中的排序问题 order by——把合并后的表作为一个临时表,再进行排序

注意临时表需要命名

排序要对新的列名进行排序

SELECT sn.*
FROM (
      SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
            ,SUM(AMT) as money 
            ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
            ,COUNT(DISTINCT dimMemberID) num_member
      FROM dw.fct_sales
      where dimDateID between '20170703' and '20170709'
      and dimMemberID <>0
      group by DATE_FORMAT(dimDateID,'%W')
      UNION 
      SELECT DATE_FORMAT(dimDateID,'%W') as week_1      /*把时间转化为星期模式*/
            ,SUM(AMT) as money 
            ,COUNT(DISTINCT salesID) as num_order       /*一个会员一周可以下多单,所以要统计会员数,需要去重*/
            ,COUNT(DISTINCT dimMemberID) num_member
      FROM dw.fct_sales
      where dimDateID between '20170703' and '20170709'
      and dimMemberID <>0
      group by DATE_FORMAT(dimDateID,'%W') ) as sn
order by money desc;                                    /*注意要对money排序,而不是SUM(AMT)*/
-- order by SUM(AMT) desc;                              /*会报错,需要用临时表的列名,并且要对临时表取列名,否则也会报错*/

到此这篇关于Mysql中使用Union—多表合并之行合并的文章就介绍到这了,更多相关Mysql使用Union行合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • win10 mysql导出csv的两种方式

    win10 mysql导出csv的两种方式

    win10导出csv有两种方式,第一种是借助工具,第二种是原始SQL语句导出,这篇文章主要介绍了win10 mysql导出csv的两种方式,需要的朋友可以参考下
    2019-12-12
  • MySQL自动停机的问题处理实战记录

    MySQL自动停机的问题处理实战记录

    这篇文章主要给大家介绍了关于MySQL自动停机的问题处理,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • MySQL中的RIGHT JOIN和CROSS JOIN操作示例

    MySQL中的RIGHT JOIN和CROSS JOIN操作示例

    本文详细介绍了MySQL中的RIGHT JOIN和CROSS JOIN操作,RIGHT JOIN返回右表中的所有记录及与左表中的记录相匹配的记录,而CROSS JOIN返回两个表中所有可能的组合,通过实际示例和输出结果,我们展示了如何使用RIGHT JOIN和CROSS JOIN进行数据库查询,一起看看吧
    2023-07-07
  • 最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)

    最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)

    这篇文章主要介绍了最新版MySQL 8.0.22下载安装超详细教程(Windows 64位),本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • MySQL慢查询的坑

    MySQL慢查询的坑

    这篇文章主要介绍了MySQL慢查询的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Linux 安装JDK Tomcat MySQL的教程(使用Mac远程访问)

    Linux 安装JDK Tomcat MySQL的教程(使用Mac远程访问)

    这篇文章主要介绍了Linux 安装JDK Tomcat MySQL(使用Mac远程访问),本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Hibernate4在MySQL5.1以上版本创建表出错 type=InnDB

    Hibernate4在MySQL5.1以上版本创建表出错 type=InnDB

    本文主要介绍解决Hibernate4在MySQL5.1自动创建表出错的方法,简单实用,需要的朋友可以参考下。
    2016-05-05
  • Centos7安装和配置Mysql5.7

    Centos7安装和配置Mysql5.7

    网上关于Linux安装mysql数据库的教程数不胜数,但是,大多教程都是漏洞百出。今天,为了帮助各位需要的人,从而写下Centos7安装配置mysql5.7的教程。
    2018-02-02
  • 解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • MySQL对limit查询语句的优化方法

    MySQL对limit查询语句的优化方法

    这篇文章主要介绍了MySQL对limit查询语句的优化方法,分别讲解了offset参数比较小和offset参数比较大的时候,如何优化查询语句,需要的朋友可以参考下
    2014-07-07

最新评论