应用场景: 取占比超80%的几个重要企业信息.
解决思路: 1 取占比,2 降序排列, 3 占比 累加总和, 4 占比超过80%的部分.
USE ods_test; DROP TABLE ods_test.comp_info; CREATE TABLE ods_test.`comp_info` ( `compname` VARCHAR(50) DEFAULT NULL, `custname` VARCHAR(50) DEFAULT NULL, `countnum` INT DEFAULT NULL ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO ods_test.`comp_info`(`compname`,`custname`,`countnum`) VALUES ('a','a1','100.00'),('a','a2','500.00'),('a','a3','500.00'),('a','a4','800.00'),('a','a5','100.00'),('a','a6','300.00') ,('b','b1','500.00'),('b','b2','600.00'),('b','b3','700.00'),('b','b4','800.00'),('b','b5','400.00'),('b','b6','300.00'),('b','b7','400.00');
DROP TABLE ods_test.comp_info_test; CREATE TABLE ods_test.`comp_info_test` SELECT a.compname,a.custname,a.countnum, a.countnum/b.sum_countnum pecent FROM ods_test.comp_info a LEFT JOIN (SELECT compname,SUM(countnum) sum_countnum FROM ods_test.comp_info GROUP BY compname) b ON a.compname=b.compname;
SET @row := 0; SET @curComp := ''; SET @curpecent := 0; SET @addpecent := 0; SET @cmpcomp := ''; SET @cmp80 := 1.000; SET @cmpcust := '';
SELECT t2.compname,GROUP_CONCAT(t2.final_custname) FROM ( SELECT t.compname,t.custname,FORMAT(t.pecent,3) ,FORMAT(t.addpecent,3) ,CASE WHEN custname IS NULL THEN NULL WHEN @cmpcomp = compname AND @cmp80 < 0.8 THEN custname WHEN @cmpcomp <> compname AND @cmp80 = 1.000 THEN custname END final_custname ,@cmpcomp :=compname ,@cmpcust := custname ,@cmp80 := addpecent FROM ( SELECT compname,custname,pecent ,CASE WHEN pecent IS NULL THEN NULL WHEN @curComp = compname AND @curpecent > pecent THEN @row := @row + 1 WHEN @curComp = compname AND @curpecent = pecent THEN @row := @row WHEN @curComp <> compname THEN @row := 1 END rank ,CASE WHEN pecent IS NULL THEN NULL WHEN @curComp = compname THEN @addpecent := @addpecent + pecent WHEN @curComp <> compname THEN @addpecent := pecent END addpecent ,@curComp := compname ,@curpecent := pecent FROM ods_test.comp_info_test ORDER BY compname,pecent DESC ) t ) t2 WHERE t2.final_custname IS NOT NULL GROUP BY t2.compname;