合并查询

需求是这样的,

使用的是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的。

不知道你看懂了没,希望能对你有点帮助,哈哈

发布了51 篇原创文章 · 获赞 1 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/panlongbao_918/article/details/86566560