关于SQL 数据提取个数的疑问!

使用的是MySQL数据库
原数据格式如下图所示:

img

想算抽检比例,并倒序排列,正常sql语句是:

SELECT `商品名`, `抽检个数`, `库存数量`,
concat( round(((SUM(`抽检个数`)/SUM(`库存数量`)) * 100 ), 3 ), '%' ) AS `抽检比例` 
FROM 表名
GROUP BY `商品名`
ORDER BY  `抽检比例` DESC

现在想取抽检比例低的,要包含所有 抽检比例 为 NULL 的商品,并且包含两个数值最低的商品,应该怎么写?
PS:直接 LIMIT 数量肯定是不行的,表数据是动态的,抽检比例 为 NULL 的商品个数不确定

其实就是取抽检个数为空的和排个序取前2的(nulls last,可是mysql没这个语法,用if和isnull处理成类似效果)

select * from (
select t.*,concat(round(抽检个数/库存数量*100,2),'%') 抽检率,
row_number() over(order by IF(ISNULL(抽检个数),1,0) ,抽检个数/库存数量) rn from t) x
where 抽检个数 is null or rn<=2

从你发出来的这个样本数据里看,没有出现重复的商品,貌似不需要求和?

img


select * from (
SELECT 商品名,
concat( round(((SUM(nvl(抽检个数,0))/SUM(库存数量)) * 100 ), 3 ), '%' ) AS 抽检比例
FROM 表名
GROUP BY 商品名
ORDER BY 抽检比例 DESC
) t
where 抽检比例="0%"