题 如何在同一个select语句中使用count和group by


我有一个具有group by的sql select查询。 我想在group by语句之后计算所有记录。 有没有办法直接从sql? 例如,有一个表与用户,我想选择不同的城镇和  用户数量

select town, count(*) from user
group by town

我想要一个包含所有城镇的列,另一个列包含所有行中的用户数。

拥有3个城镇和58个用户的结果示例如下:

Town         Count
Copenhagen   58
NewYork      58
Athens       58

181
2018-04-27 15:15


起源


你的意思是你希望你的结果集对于城镇有2个计数,对用户有1个计数? - Leslie
因此,您希望每个城镇都有一行,而在每一行中,第2列包含所有用户的总数?所以第2列有 相同 每行的价值?如果您编辑以包含样本数据和所需输出,我们将能够准确地为您提供所需内容。 - AakashM
你是对的AakashM!我刚刚编辑过它。 - Stavros
相关问题: stackoverflow.com/questions/5146978/... - milkovsky
警告读者:大多数答案都无法为更新后的查询提供答案。 - Rick James


答案:


这将做你想要的(城镇列表,每个城镇的用户数量):

select town, count(town) 
from user
group by town

你可以使用最多 集合函数 使用时 GROUP BY

更新 (更改问题和评论后)

您可以为用户数声明一个变量,并将其设置为用户数,然后选择该用户。

DECLARE @numOfUsers INT
SET @numOfUsers = SELECT COUNT(*) FROM user

SELECT DISTINCT town, @numOfUsers
FROM user

230
2018-04-27 15:17



这正是OP所写的内容? nvm,我看到你的不同,你在计算城镇不是* .... - Leslie
@Leslie - 两个查询之间没有区别。它们将返回相同的结果集。我只是不喜欢使用 *... OP回答了他自己的问题,但似乎没有测试它,我只是验证它是正确的:) fredosaurus.com/notes-db/select/groupby.html - Oded
COUNT(*)可能不等于COUNT(镇)。在COUNT中使用*是完全有效的...... - gbn
我想要用户总数。不是每个城镇的用户.. - Stavros
再次不是我希望的,但似乎这是最好的解决方案..;)谢谢 - Stavros


您可以使用 COUNT(DISTINCT ...) :

SELECT COUNT(DISTINCT town) 
FROM user

128
2018-06-11 12:29



作为一个魅力...应该选择主要答案..除了一些调查,这是不好的。 - Victor
不与WHERE子句组合使用。 - Per Lindberg
@PerLindberg,对我有用。在FROM之后添加WHERE。 - milkovsky
我认为他们的意思是你把COUNT(DISTINCT镇)放在WHERE子句中。这是因为它是一个聚合函数,需要在HAVING子句中提供。由于COUNT和DISTINCT关键字,每个关键字本身也会隐式分组,因此SELECT COUNT(DISTINCT town)变为隐式GROUP BY时,此SQL查询会误导某些人。 - A. Greensmith
谢谢。给予好评。究竟需要什么 - 在一个操作中对组+计数并在结果中获得单行。 - Green


另一种方式是:

/* Number of rows in a derived table called d1. */
select count(*) from
(
  /* Number of times each town appears in user. */
  select town, count(*)
  from user
  group by town
) d1

31
2017-10-15 00:52



需要别名否则无法在mysql中工作。从()agr中选择count(*) - amas


使用Oracle,您可以使用分析函数:

select town, count(town), sum(count(town)) over () total_count from user
group by town

您的其他选择是使用子查询:

select town, count(town), (select count(town) from user) as total_count from user
group by town

3
2018-04-28 07:02



像最后一个可以工作的东西,但我想看看是否有任何其他解决方案.. - Stavros
你不能使用第一个(分析功能)选项吗?您使用的是什么数据库平台? - Tommi
@Stavros:最后一个很慢 - Michael Buen


如果你想按计数订购(声音很简单,但我找不到如何做到这一点的答案)你可以这样做:

        SELECT town, count(town) as total FROM user
        GROUP BY town ORDER BY total DESC

2
2017-12-18 18:22





您可以在COUNT中使用DISTINCT,就像milkovsky所说的那样

在我的情况下:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);

这将把被认为与一个计数相同的user_id的答案投票数量拉出来


2
2017-10-06 05:47





我知道这是SQL Server中的旧帖子:

select  isnull(town,'TOTAL') Town, count(*) cnt
from    user
group by town WITH ROLLUP

Town         cnt
Copenhagen   58
NewYork      58
Athens       58
TOTAL        174

2
2018-03-12 00:31



回答旧帖子没有错。但是,请包含对代码的解释以及代码本身。 - Shelvacu
MySQL等价物(IFNULL 代替 ISNULL)导致每个城镇的数字不同;用户想要总数。根据该问题,58,而不是174,是总数。 - Rick James


如果要选择城镇和总用户数,可以使用以下查询:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;

1
2017-10-14 06:54



这假定(可能合理地)没有重复的“用户” User。 - Rick James