SQL计数行而不使用Count()

时间:2019-02-22 15:14:44

标签: sql count

我有一张这样的桌子:

Name     Food
Tom     |Ice Cream
Tom     |Apple
Sam     |Burger
Tom     |Burger
Jim     |Ice Cream
Sam     |Ice Cream

我需要选择至少喜欢两种食物而不使用Count()的孩子的名字,因此结果应类似于:

Name     c
Tom     |3
Sam     |2

我们的大学老师说,我们应该通过将表本身乘以来尝试此操作,但是我找不到或提出解决方案。 该代码将与所需代码等效:

select name from (select name, count(*) as c from kids group by name) where c>1;

5 个答案:

答案 0 :(得分:2)

这项工作可以吗?

declare @tempTable table (name varchar(max), food varchar(max))
insert into @tempTable select 'Tom', 'Ice Cream'
insert into @tempTable select 'Tom', 'Apple'
insert into @tempTable select 'Sam', 'Burger'
insert into @tempTable select 'Tom', 'Burger'
insert into @tempTable select 'Jim', 'Ice Cream'
insert into @tempTable select 'Sam', 'Ice Cream'

select t1.name, 0+SUM(1) from @tempTable t1 group by t1.name having SUM(1)>1

结果 名称(无列名) 山姆2 汤姆3

答案 1 :(得分:1)

另一种解决方案...

declare @tempTable table (name varchar(max), food varchar(max))
insert into @tempTable select 'Tom', 'Ice Cream'
insert into @tempTable select 'Tom', 'Apple'
insert into @tempTable select 'Sam', 'Burger'
insert into @tempTable select 'Tom', 'Burger'
insert into @tempTable select 'Jim', 'Ice Cream'
insert into @tempTable select 'Sam', 'Ice Cream'

select distinct t1.name from @tempTable t1 join @tempTable t2 on t2.name = t1.name and t2.name+t2.food <> t1.name+t1.food

这不会显示您的人数,因为我们没有count(*),但是会告诉您谁有多个。

答案 2 :(得分:0)

未经测试的SQL解决方案。

select a.name from kids a, kids b 
where a.name = b.name and a.food != b.food
group by a.name;

不确定为什么您的教授强迫您写出次优的解决方案,但我想它会为您提供有关联接工作原理的见识。

最终解决方案已通过测试!

select distinct a.name from kids a, kids b 
where a.name = b.name 
  and a.food != b.food;

答案 3 :(得分:0)

尝试这样的事情:

SELECT a1.name, 1 + SUM( 1 ) AS c
FROM kids AS a1  JOIN kids AS a2 ON a1.name = a2.name AND a1.food <> a2.food
GROUP BY a1.name
HAVING SUM( 1 ) > 0

答案 4 :(得分:0)

仅使用分组依据

  select name ,count(*) from tab group by name
  having count(*)>1

不需要任何子查询