取占比累计超过80%的几条记录

it2022-05-05  137

应用场景: 取占比超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;


最新回复(0)