合併查詢

需求是這樣的,

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

不知道你看懂了沒,希望能對你有點幫助,哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章