我发现找到非零的最小值时遇到了问题。
例如,我有一张表格,显示每个人赚取的金额,其中一些人不赚钱。我想排除那些赚不到钱的人,找到收入最少的人的名字(非零)。
我试过了:
SELECT name, earnings
FROM paylist
WHERE earnings = (SELECT min(earnings)
FROM paylist) AND EXISTS (SELECT *
FROM paylist
WHERE earning <> 0)
但我意识到min(收益)将变为0并且在输出中不返回任何值。 我该如何编写查询?
另外,我被告知有两种方法可以写这个: 1.具有聚合函数(例如COUNT,SUM,MAX,MIN) 2.不使用任何聚合函数 有什么区别?
答案 0 :(得分:1)
使用子查询中的条件省略收入为零的行并找到最低收入并在外面使用。
select name,
earnings
from paylist
where earnings = (
select min(earnings)
from paylist
where earnings <> 0
)
或者使用nullif
,它可以使用min返回最小非空值的事实:
select name,
earnings
from paylist
where earnings = (
select min(nullif(earnings,0))
from paylist
)
不同之处在于第一个可以使用索引(如果有的话)。以上两个将返回所有行,其中非零收入最低
如果您只想要一行收益最少的非零,则可以使用limit
(无需汇总):
select *
from paylist
where earnings <> 0
order by earnings
limit 1
答案 1 :(得分:0)
假设有一个表 T00188SK,它总共有 6 列(id、C0、C1、C2、C3、C4),其中 id 是 AUTO_INCREMENT PRIMARY KEY 列。如果你想从 (C0, C1, C2, C3, C4) 中找到除零以外的最小值
MySQL 有一种巧妙的方法可以做到这一点。简单地去:
SELECT LEAST(MIN(NULLIF(C0, 0)), MIN(NULLIF(C1, 0)), MIN(NULLIF(C2, 0)), MIN(NULLIF(C3, 0)), MIN (NULLIF(C4, 0))) AS finalmin FROM T00188SK
#SQL #MySQL #数据库