需求是這樣的,
使用的是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的。
不知道你看懂了沒,希望能對你有點幫助,哈哈