mysql sql汇总查询将两个结果集合并一行展示

最近在做一个统计功能,其中有根据一张表中的一个字段的不同状态统计,输出时将同一笔业务的多个数据集合成一条数据进行展示。

数据库是MYSQL,直接上代码,实例如下:

 

建表语句:

CREATE TABLE `TB_TABLE` (
  `ID` char(32) NOT NULL COMMENT '主键',
  `BIZ_NUM` varchar(30) DEFAULT NULL COMMENT '业务编号',
  `BIZ_AMT` int(11) DEFAULT NULL COMMENT '金额',
  `TYPE` char(11) DEFAULT NULL COMMENT '类型,01-流入;02-流出',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='信息表';


INSERT INTO TB_TABLE VALUES('1','111',120,'01');
INSERT INTO TB_TABLE VALUES('2','111',80,'02');
INSERT INTO TB_TABLE VALUES('3','111',30,'01');
INSERT INTO TB_TABLE VALUES('4','222',70,'01');
INSERT INTO TB_TABLE VALUES('5','222',50,'02');

 

预期输出效果:

业务编号      流入金额      流出金额

111                    150            80

222                    70              50

 

方法一:

select 
t.biz_num,
sum(case when t.type='01' then t.biz_amt end) as bizAmtIn,
sum(case when t.type='02' then t.biz_amt end) as bizAmtOut
from tb_table t
where t.type in ('01','02')
group by t.biz_num

 方法二:

select 
t.biz_num,
sum(if(t.type='01',t.biz_amt,0)) as bizAmtIn,
sum(if(t.type='02',t.biz_amt,0)) as bizAmtOut
from tb_table t
where t.type in ('01','02')
group by t.biz_num;

 

 

### SQL 集合运算概述 SQL 提供了多种集合运算来处理多个查询结果之间的关系,这些运算是基于数学中的集合理论设计的。主要的集合运算包括 ** (UNION)**、**交 (INTERSECT)** 和 **差 (EXCEPT 或 MINUS)**。 #### 1. (UNION / UNION ALL) `UNION` 是用于合并两个或多个 `SELECT` 查询结果的操作符。它会自动去除重复行,返回唯一的记录组合[^1]。如果希望保留所有的重复行,则可以使用 `UNION ALL`,该操作不会去重[^4]。 以下是 `UNION` 和 `UNION ALL` 的语法示例: ```sql -- 使用 UNION 去除重复行 SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; -- 使用 UNION ALL 保留所有行 SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2; ``` 需要注意的是,参与 `UNION` 或 `UNION ALL` 的各个查询必须具有相同的列数和兼容的数据类型[^3]。 --- #### 2. 交 (INTERSECT) `INTERSECT` 操作符用于返回两个查询结果中共有的行。这意味着只有那些同时存在于两个结果中的数据会被返回[^1]。然而,在某些数据库(如 MySQL)中不原生支持 `INTERSECT`,但在 Oracle 数据库中它是可用的[^4]。 下面是一个在 Oracle 中使用的例子: ```sql -- Oracle 支持 INTERSECT SELECT column_name(s) FROM table1 INTERSECT SELECT column_name(s) FROM table2; ``` 对于不支持 `INTERSECT` 的数据库,可以通过其他方式模拟其功能,例如通过子查询结合 `IN` 来实现[^1]。 --- #### 3. 差 (EXCEPT / MINUS) `EXCEPT` 或者 `MINUS` 操作符用来获取第一个查询结果中存在而第二个查询结果中不存在的行。这相当于从一个集合中移除另一个集合的内容[^1]。同样地,MySQL 不直接支持 `EXCEPT`,但可以用 `NOT IN` 或 `LEFT JOIN` 实现类似的逻辑。 下面是 Oracle 中的一个实例: ```sql -- Oracle 支持 MINUS SELECT column_name(s) FROM table1 MINUS SELECT column_name(s) FROM table2; ``` 而在 MySQL 中,可能需要这样写: ```sql -- 在 MySQL 中模拟 EXCEPT/Minus 功能 SELECT column_name(s) FROM table1 WHERE column_name NOT IN (SELECT column_name FROM table2); ``` --- ### 注意事项 - 所有涉及的查询结果需满足一定的约束条件:它们应拥有相等数量的列,且对应的每一列都应当具备可比较的数据类型。 - 结果中不允许包含诸如 `ORDER BY` 或者 `COMPUTE` 子句的部分复杂表达式。 --- ### 总结 综上所述,SQL集合运算提供了强大的工具来进行多表或多查询间的数据整合与分析。无论是简单的数据汇总还是复杂的对比筛选,都可以借助于 `UNION`, `INTERSECT`, 及 `EXCEPT/MINUS` 完成相应的任务。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值