合并查询

需求是这样的,

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值