需求是这样的,
使用的是mysql的数据库,要查一个表中对应10开头的组织的销售额,退货额,和盈亏,sql如下
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `sale`
-- ----------------------------
DROP TABLE IF EXISTS `sale`;
CREATE TABLE `sale` (
`id` varchar(10) NOT NULL DEFAULT '',
`org_code` varchar(255) NOT NULL DEFAULT '',
`real_num` int(11) DEFAULT NULL,
`type` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sale
-- ----------------------------
INSERT INTO `sale` VALUES ('1', '100', '12', '0');
INSERT INTO `sale` VALUES ('10', '104', '12', '1');
INSERT INTO `sale` VALUES ('11', '103', '12', '1');
INSERT INTO `sale` VALUES ('12', '102', '21', '1');
INSERT INTO `sale` VALUES ('2', '100', '10', '0');
INSERT INTO `sale` VALUES ('3', '100', '8', '0');
INSERT INTO `sale` VALUES ('4', '101', '12', '0');
INSERT INTO `sale` VALUES ('5', '102', '12', '0');
INSERT INTO `sale` VALUES ('6', '102', '21', '0');
INSERT INTO `sale` VALUES ('7', '100', '12', '1');
INSERT INTO `sale` VALUES ('8', '100', '10', '1');
INSERT INTO `sale` VALUES ('9', '100', '8', '1');
type:0 销售额 1 退货额
网上找了一圈没有找到合适的方案,只能自己想了,想得到的结果如下:
一开始先把销售额的给统计出来
select org_code,sum(real_num) sum1 from sale where org_code like "10%" and type='0' group by org_code
再把退货额的给统计出来
select org_code,sum(real_num) sum1 from sale where org_code like "10%" and type='1' group by org_code
然后,想着怎么才能把这两个集合弄到一起,就想到了用join的方式,左联结,右联结之类的,我也在网上搜了一把
大家可以看看这个:
https://www.cnblogs.com/fudashi/p/7491039.html
如果没时间,简单示意图如下
我想集合的联结,上面的图已经很清楚了
按道理来说,我需要的应该是full outer join这种方式,但是实际上的,我测试了下,直接用left join 也是ok的,只是需要稍稍修改下就行了,如:
sql如下:
SELECT
t2.org_code,
t1.sum1 AS 销售额,
t2.sum2 AS 退货额,
IFNULL(t1.sum1, 0) + IFNULL(t2.sum2, 0) AS 盈亏
FROM
(
SELECT
org_code,
sum(real_num) sum1
FROM
sale
WHERE
org_code LIKE "10%"
AND type = '0'
GROUP BY
org_code
) t1
LEFT JOIN (
SELECT
org_code,
sum(real_num) sum2
FROM
sale
WHERE
org_code LIKE "10%"
AND type = '1'
GROUP BY
org_code
) t2 ON t1.org_code = t2.org_code
从结果上看,似乎是我们要的结果,实际上还差得远,因为
org_code 可能是t1是有,t2里面没有,也就是说有些组织是只有销售额,没有退货额。反之也有可能会出现有退货额,而没有销售额。这两个情况都可能会出现,于是,我又想到了IFNULL这个函数,这个函数用会了,会很爽。
经过一番测试,ok了
改造后的sql, 不管是左联结,还是右联结,都是OK的。
不知道你看懂了没,希望能对你有点帮助,哈哈