#mysql#分组查询,大于某值

如图:

img

mysql数据结构是这样,我想取数据中每天(day)的money字段都大于10000的name字段(名字),李四在11号小于10000,只有张三在每天11、12号都大于10000,也就是说现在数据中只有张三满足、sql怎么编写

select a.name
from (select t.name where table(表) t where t.money > 10000 group by t.name) a
where a.name not in (select c.name where table(表) c where c.money <= 10000 group by c.name)


select a.name from (select name,sum(1) c fromwhere money >10000 group by DATE_FORMAT(day,'%Y%m%d'),name) a
left join (select count(1) c fromgroup by DATE_FORMAT(day,'%Y%m%d')) b
where a.c=b.c

题主,你自己套一下吧,很简单的

统计数据后筛选大于2的数据:

SELECT name,count(*) as count FROM `test` GROUP BY name HAVING count>2

可以这么写
select * from (select A.name,date_format( A.day,'%Y-%m-%d') AS everyDay from table A where A.money>10000) B group by B.name ,B.everyDay

SELECT * FROM (
SELECT name,COUNT(name) j FROM [dbo].[SLL_test1]
WHERE money>10000 GROUP BY name
) a
WHERE a.j=2

为了让题主更好的理解,特意新建了一张表,实际操作后给出的答案。

答案如下:
不妨用逆向思维思考一下,每天都要大于10000 == 最小值大于10000 如此得出SQL

select name,min(money) from bill GROUP BY name having min(money)>10000

img

每天都要大于1w是不是就是等价于 对应的每个组下面的最小值大于10000 如此就得出了一下的sql

select name from TABLE GROUP BY `name` having MIN(money) > 10000;

有不懂欢迎追问~ 首先说一下思路
两个部分
第一部分 获取两个日期相差多少天,即总天数记为all_days
第二部分 分别获取每一个人达标(>10000)的不同天数 记为 reach_days

select name,count(distinct date_format(day,'%Y%m%d')) reach_days,(select TO_DAYS('20220812') - TO_DAYS('20220811')+1) all_days
from Test
where date_format(day,'%Y%m%d') between '20220811' and '20220812'
and money > 10000
group by name

运行结果

img

当all_days == reach_days ,即说明该用户在该时间段内每天达标了,在上述结果外面嵌套一层

完整代码,我建的表是Test,换成自己的

select * from (
select name,count(distinct date_format(day,'%Y%m%d')) reach_days,(select TO_DAYS('20220812') - TO_DAYS('20220811')+1) all_days
from Test
where date_format(day,'%Y%m%d') between '20220811' and '20220812'
and money > 10000
group by name) a
where a.reach_days = a.all_days

运行结果

img