话不多说直接上测试代码:
create table persontest
(
name nvarchar(10),
age int
)
insert into persontest
(name, age)
values
('a',3),
('a',3),
('b',4),
('b', 3)
以上sql跑完了之后你应该能得到大概这么一个表:
name age
a 3
a 3
b 4
b 3
现在我要进行类似这么一个查找(该sql肯定是不能跑的, 我只是用它来表达我想要做的查询)
select name, age
from persontest
group by name
having all age = 3
我期待的结果是:
(a,3), 或者能直接查出(a)也是可以接受的。
因为对于a来说, 所有的a的age都是3,因此a符合条件, 我要a了
b的话, 有一个4, 所以不全是3, 因此b不合格。b被踢掉了。
就是这么个需求。
由于聚合函数里我没找到类似于"all"这样的函数, 所以弄不清这个到底如何写。
有谁有办法吗?非常感谢。 圆豆不是问题。
补充:数据库是sql server
select name from (
select name,age
from persontest
group by name,age) as n
group by name
having COUNT(1)=1
你是要找 name分组后,所有age都相同的么.?
好像可以啊
很接近了。 根据你的sql我写出来我要的了。
灰常感谢, 就你了。
@undefined: 你妹,给我给点疯
@小AI: 谁叫你答不出。 咱问问题就是这么干脆利索,不拖泥带水。
@undefined:
擦,这么麻利?我还没赚分呢!结贴!我准备顶回答问题的大屁股呢!
你的意思是要找所有age=3且没有age<>3的name是吗?
试试select name from persontest p where age = 3 and not exists(select name from persontest where p.name = persontest.name and age <> 3)
虽然没读懂你的话, 但是我感觉你说的应该就是我的意思。
比如全天下叫张三的人今年都3岁, 那就显示张三
而全天下叫李四的人, 有三岁的有四岁的, 不显示李四。
全天下叫王五的人, 全都不是三岁的, 不显示王五。
太难了。。
顶一下
select name , min(age) from persontest group by name having min(age)=max(age)
select name ,age, COUNT(*) AS num
from persontest
group by name,age
having age= 2
按照你的问题题意,下列sql也能查出a
/*反向求解*/
select distinct name from personTest as a
where a.name not in (select distinct name from personTest where age!='3')
/*正向求解*/
select distinct name from personTest as a
where 3 = all(select b.age from personTest as b where a.name = b.name)