SQL 查询中分组 COUNT 的总和
Posted
技术标签:
【中文标题】SQL 查询中分组 COUNT 的总和【英文标题】:SUM of grouped COUNT in SQL Query 【发布时间】:2012-10-07 07:04:35 【问题描述】:我有一个包含 2 个字段的表格:
身份证名称 -- ------ 1 阿尔法 2 测试版 3 测试版 4 测试版 5 查理 6查理我想按名称、'count' 和一行'SUM'对它们进行分组
名称计数 -------- ----- 阿尔法 1 测试版 3 查理 2 总和 6如何编写查询以在表格下方添加 SUM 行?
【问题讨论】:
如果您需要选择本身的总和来计算,请使用子选择:SELECT Name, COUNT(*) AS amount, COUNT(*)/total.total * 100 AS percentage, total.total FROM temp, ( SELECT COUNT(*) AS total FROM temp ) AS total GROUP BY Name
See SQLfiddle
注意下面的答案——没有 ORDER BY 的查询结果中没有保证顺序。
【参考方案1】:
我解释这个问题的方式是需要每组答案的小计值。使用PARTITION
,小计结果非常简单:
SUM(COUNT(0)) OVER (PARTITION BY [Grouping]) AS [MY_TOTAL]
这是我完整的 SQL 调用的样子:
SELECT MAX(GroupName) [name], MAX(AUX2)[type],
COUNT(0) [count], SUM(COUNT(0)) OVER(PARTITION BY GroupId) AS [total]
FROM [MyView]
WHERE Active=1 AND Type='APP' AND Completed=1
AND [Date] BETWEEN '01/01/2014' AND GETDATE()
AND Id = '5b9xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' AND GroupId IS NOT NULL
GROUP BY AUX2, GroupId
由此返回的数据如下:
name type count total
Training Group 2 Cancelation 1 52
Training Group 2 Completed 41 52
Training Group 2 No Show 6 52
Training Group 2 Rescheduled 4 52
Training Group 3 NULL 4 10535
Training Group 3 Cancelation 857 10535
Training Group 3 Completed 7923 10535
Training Group 3 No Show 292 10535
Training Group 3 Rescheduled 1459 10535
Training Group 4 Cancelation 2 27
Training Group 4 Completed 24 27
Training Group 4 Rescheduled 1 27
【讨论】:
【参考方案2】:这里的所有解决方案都很棒,但不一定可以用于旧的 mysql 服务器(至少在我的情况下)。所以你可以使用子查询(我认为它不那么复杂)。
select sum(t1.cnt) from
(SELECT column, COUNT(column) as cnt
FROM
table
GROUP BY
column
HAVING
COUNT(column) > 1) as t1 ;
【讨论】:
这对我来说很有意义【参考方案3】:我还需要having count(*) > 1
。因此,在参考了上述一些查询后,我编写了自己的查询
语法:
select sum(count) from (select count(`table_name`.`id`) as `count` from `table_name` where some condition group by some_column having count(`table_name`.`id`) > 1) as `tmp`;
例子:
select sum(count) from (select count(`table_name`.`id`) as `count` from `table_name` where `table_name`.`name` IS NOT NULL and `table_name`.`name` != '' group by `table_name`.`name` having count(`table_name`.`id`) > 1) as `tmp`;
【讨论】:
【参考方案4】:我正在使用 SQL 服务器,以下内容应该适合您:
select cast(name as varchar(16)) as 'Name', count(name) as 'Count' 从表 1 按名称分组 联合所有 选择“总和:”,计数(名称) 来自表1
【讨论】:
【参考方案5】:SELECT name, COUNT(name) AS count
FROM table
GROUP BY name
UNION ALL
SELECT 'SUM' name, COUNT(name)
FROM table
输出:
name count
-------------------------------------------------- -----------
alpha 1
beta 3
Charlie 2
SUM 6
【讨论】:
有效答案。请使用汇总查看@Adrinn 的答案。 ***.com/a/12927333/2012977 什么是Union all
?编辑:好的,我因为它的缩进而感到困惑。这只是联合 2 个选择器 :)【参考方案6】:
试试这个:
SELECT ISNULL(Name,'SUM'), count(*) as Count
FROM table_name
Group By Name
WITH ROLLUP
【讨论】:
【参考方案7】:你可以使用 ROLLUP
select nvl(name, 'SUM'), count(*)
from table
group by rollup(name)
【讨论】:
【参考方案8】:从中选择总和 (select count(Col_name) as s from Tab_name group by Col_name with count(*)>1)c
【讨论】:
【参考方案9】: with cttmp
as
(
select Col_Name, count(*) as ctn from tab_name group by Col_Name having count(Col_Name)>1
)
select sum(ctn) from c
【讨论】:
【参考方案10】:请如下运行:
Select sum(count)
from (select Name,
count(Name) as Count
from YourTable
group by Name); -- 6
【讨论】:
【参考方案11】:查询后,在下面运行以获取总行数
select @@ROWCOUNT
【讨论】:
他想知道例如 CHARLIE 的计数,而不是 NAMES 的计数。【参考方案12】:SELECT name, COUNT(name) AS count, SUM(COUNT(name)) OVER() AS total_count
FROM Table GROUP BY name
【讨论】:
你能补充一些解释吗? 我添加了缺失的部分 这行得通,但解释会很有用。【参考方案13】:Sql server 你可以试试这个。
SELECT ISNULL([NAME],'SUM'),Count([NAME]) AS COUNT
FROM TABLENAME
GROUP BY [NAME] WITH CUBE
【讨论】:
【参考方案14】:把它当作
select Name, count(Name) as Count from YourTable
group by Name
union
Select 'SUM' , COUNT(Name) from YourTable
【讨论】:
我选择 UNION ALL 而不是 UNION 将“SUM”行放在底部(根据上面@VishalSuthar 的回答) 我认为你误解了 UNION 和 UNION ALLUNION removes duplicate records (where all columns in the results are the same), UNION ALL does not.
那是我使用的 UNION
感谢您的更正,但在这种情况下,我必须将“SUM”放在底线,这可以通过使用 UNION ALL 来完成
您是否尝试使用 UNION?正如我所尝试的,它必须将“SUM”放在底部,但就性能而言,UNION ALL 在您的场景中是好的,因为 UNION 很多性能较差,因为它必须扫描结果以查找重复项..
我已经在更大的数据库中尝试过它,它将“SUM”放在表格的中间(并不总是在底部)。无论如何,我明白了 UNION ALL 和 UNION 之间的区别,谢谢【参考方案15】:
不指定你使用的是哪个 rdbms
看看这个演示
SQL Fiddle DEMO
SELECT Name, COUNT(1) as Cnt
FROM Table1
GROUP BY Name
UNION ALL
SELECT 'SUM' Name, COUNT(1)
FROM Table1
也就是说,我建议由您的表示层添加总数,而不是由数据库添加。
这更像是一个使用 Summarizing Data Using ROLLUP 的 SQL SERVER 版本
SQL Fiddle DEMO
SELECT CASE WHEN (GROUPING(NAME) = 1) THEN 'SUM'
ELSE ISNULL(NAME, 'UNKNOWN')
END Name,
COUNT(1) as Cnt
FROM Table1
GROUP BY NAME
WITH ROLLUP
【讨论】:
第二次选择不应该是总和,而不是计数吗? @Greg,如果您重新引用顶部的语句,它应该是 sum,可能使用 WITH CTE 语句(Sql Server)。 感谢您指出汇总。您的答案应该是公认的答案。我们有很大的桌子,讨厌两次敲桌子。【参考方案16】:您可以使用联合来连接行。
select Name, count(*) as Count from yourTable group by Name
union all
select "SUM" as Name, count(*) as Count from yourTable
【讨论】:
【参考方案17】:您可以尝试按名称分组并计算该组中的 ID。
SELECT name, count(id) as COUNT FROM table group by name
【讨论】:
我认为您错过了“SUM”行以上是关于SQL 查询中分组 COUNT 的总和的主要内容,如果未能解决你的问题,请参考以下文章