sql union 合并数据 参考

 需求是,求每个月份下,支付订单量、结算订单量、总订单量(各订单量的查询条件并不相同,但是返回数据格式相同)

想要的结果如图:

 

但是每类订单量的查询条件是不一样的,如下列各查询的条件  order_status_key

首先是要将每个月份下的各订单量分别查询出来:

-- 每月支付订单量
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,count(o.guide_order_id) payOrderCount,0 finishOrderCount,0 allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key = 1 and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c') ;
-- 结果 
| dateValue | payOrderCount | finishOrderCount | allOrderCount |
3月	28	0	0
4月	1591	0	0
5月	5282	0	0
6月	8097	0	0
7月	1260	0	0

-- 每月结算订单量
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,0 payOrderCount,count(o.guide_order_id) finishOrderCount,0 allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key = 2 and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c') ;
-- 结果 
| dateValue | payOrderCount | finishOrderCount | allOrderCount |
2月	0	2	0
3月	0	159	0
4月	0	1454	0
5月	0	4209	0
6月	0	5676	0
7月	0	170	0

-- 每月总订单量
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,0 payOrderCount,0 finishOrderCount,count(o.guide_order_id) allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key in (1,2) and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c');
-- 结果 
| dateValue | payOrderCount | finishOrderCount | allOrderCount |
2月	0	0	2
3月	0	0	187
4月	0	0	3045
5月	0	0	9491
6月	0	0	13773
7月	0	0	1430

然后UNION合并这些结果,然而并不是想要的结果:

-- 使用UNION语句合并数据
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,count(o.guide_order_id) payOrderCount,0 finishOrderCount,0 allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key = 1 and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c') 
UNION 
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,0 payOrderCount,count(o.guide_order_id) finishOrderCount,0 allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key = 2 and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c') 
UNION 
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,0 payOrderCount,0 finishOrderCount,count(o.guide_order_id) allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key in (1,2) and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c');
-- 结果 
| dateValue | payOrderCount | finishOrderCount | allOrderCount |
3月	28	0	0
4月	1591	0	0
5月	5282	0	0
6月	8097	0	0
7月	1260	0	0
2月	0	2	0
3月	0	159	0
4月	0	1454	0
5月	0	4209	0
6月	0	5676	0
7月	0	170	0
2月	0	0	2
3月	0	0	187
4月	0	0	3045
5月	0	0	9491
6月	0	0	13773
7月	0	0	1430

将上边的查询结果用临时表按日期字段分组查询,各订单求和汇总,得到想要的结果:

-- 用临时表解决问题
select dateValue,sum(payOrderCount) payOrderCount,sum(finishOrderCount) finishOrderCount,sum(allOrderCount) allOrderCount from 
(
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,count(o.guide_order_id) payOrderCount,0 finishOrderCount,0 allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key = 1 and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c') 
UNION 
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,0 payOrderCount,count(o.guide_order_id) finishOrderCount,0 allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key = 2 and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c') 
UNION 
select CONCAT(DATE_FORMAT(o.pay_date,'%c'),'月') dateValue,0 payOrderCount,0 finishOrderCount,count(o.guide_order_id) allOrderCount from boom_shopping_guide_order o WHERE o.order_status_key in (1,2) and o.pay_date between "2019-01-01" and "2019-12-31" group by DATE_FORMAT(o.pay_date,'%c')
) tempTable group by dateValue;
-- 结果 
| dateValue | payOrderCount | finishOrderCount | allOrderCount |
2月	0	2	2
3月	28	159	187
4月	1591	1454	3045
5月	5282	4209	9491
6月	8097	5676	13773
7月	1260	170	1430

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL语法大全 SQL语法大全 1. ASP与Access数据库连接: 2. ASP与SQL数据库连接: 建立记录集对象: set rs=server.createobject("adodb.recordset") rs.open SQL语句,conn,3,2 3. SQL常用命令使用方法: (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in (\'值1\',\'值2\',\'值3\')" sql="select * from 数据表 where 字段名 between 值1 and 值2" (2) 更新数据记录: sql="update 数据表 set 字段名=字段值 where 条件表达式" sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" (3) 删除数据记录: sql="delete from 数据表 where 条件表达式" sql="delete from 数据表" (将数据表所有记录删除) (4) 添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)" sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" set rs=conn.excute(sql) 用 rs("别名") 获取统的计值,其它函数运用同上。 (5) 数据表的建立和删除: CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 例:CREATE TABLE tab01(name varchar(50),datetime default now()) DROP TABLE 数据表名称 (永久性删除一个数据表) 4. 记录集对象的方法: rs.movenext 将记录指针从当前的位置向下移一行 rs.moveprevious 将记录指针从当前的位置向上移一行 rs.movefirst 将记录指针移到数据表第一行 rs.movelast 将记录指针移到数据表最后一行 rs.absoluteposition=N 将记录指针移到数据表第N行 rs.absolutepage=N 将记录指针移到第N页的第一行 rs.pagesize=N 设置每页为N条记录 rs.pagecount 根据 pagesize 的设置返回总页数 rs.recordcount 返回记录总数 rs.bof
注:分二卷,点击上传者查看第二卷地址。亲,本人纯手工添加了书签哦!!方便阅读  《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008中新增加的一些特性。主要包括SQL的基础理论、逻辑查询处理、SELECT查询、连接和子查询、表表达式、过滤和分组、透视转换、修改数据、事务和一致性的处理、可编程对象等内容。   书中并非系统地罗列T-SQL的各种语法元素,而是结合实践中的各种问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。本书内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性较强,可以把它们作为解决实际问题的标准模板。阅读本书,可以充分地理解T-SQL语言和获得良好的编程实践,学会如何编写更加有效而强大的查询。书中大部分章节后面都提供了练习题目,可以帮助读者更好地掌握所学的内容。   《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》适合须要学习T-SQL的各级程序员和数据库专业人员,是他们快速掌握T-SQL的必备参考图书。 致谢 引言 第1章 T-SQL查询和编程基础 1.1 理论背景 1.2 SQL SERVER体系结构 1.3 创建表和定义数据完整性 1.4 总结 第2章 单表查询 2.1 SELECT语句的元素 2.2 谓词和运算符 2.3 CASE表达式 2.4 NULL值 2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接 3.2 内联接 3.3 特殊的联接实例 3.4 外联接 3.5 总结 3.6 练习 3.7 解决方案 第4章 子查询 4.1 独立子查询 4.2 相关子查询 4.3 高级子查询 4.4 总结 4.5 练习 4.6 解决方案 第5章 表表达式 5.1 派生表 5.2 公用表表达式(CTE) 5.3 视图 5.4 内联表值函数 5.5 APPLY运算符 5.6 总结 5.7 练习 5.8 解决方案 第6章 集合运算 6.1 UNION(并集)集合运算 6.2 INTERSECT(交集)集合运算 6.3 EXCEPT(差集)集合运算 6.4 集合运算的优先级 6.5 避开不支持的逻辑查询处理 6.6 总结 6.7 练习 6.8 解决方案 第7章 透视、逆透视及分组集 7.1 透视转换 7.2 逆透视转换 7.3 分组集 7.4 总结 7.5 练习 7.6 解决方案 第8章 数据修改 8.1 插入数据 8.2 删除数据 8.3 更新数据 8.4 合并数据 8.5 通过表表达式修改数据 8.6 带有TOP选项的数据更新 8.7 OUTPUT子句 8.8 总结 8.9 练习 8.10 解决方案 第9章 事务和并发 9.1 事务 9.2 锁定和阻塞 9.3 隔离级别 9.4 死锁 9.5 总结 9.6 练习 第10章 可编程对象 10.1 变量 10.2 批处理 10.3 流程控制元素 10.4 游标 10.5 临时表 10.6 动态SQL 10.7 例程 10.8 错误处理 10.9 总结 附录A SQL SERVER使用入门 索引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值