SQL多个COUNT

时间:2011-03-14 16:46:36

标签: sql count

让我们考虑一下这个表:

[name] [type]
"Ken Anderson" 1
"John Smith" 2
"Bill Anderson" 1
"George Anderson" 1
"Taylor Smith" 1
"Andrew Anderson" 2
"Dominic Smith" 2

和那个查询:

SELECT mates.type, COUNT(*) AS SmithsCount
FROM mates
WHERE mates.name LIKE "* Smith"
GROUP BY mates.type

结果应该像

[type] [SmithsCount]
1 1
2 2

如果我想在每个组中获得 Andersons Count怎么办?像

[type] [SmithsCount] [AndersonsCount]
1 1 3
2 2 1

当然,我希望这是最简单的,因为它可以;)我是SQL的新手,我在W3学校和http://www.sql-tutorial.net/上学习了教程,但是只有很少的基础知识,任何“更多”复杂的查询。有人有一些有用的链接吗?感谢。

4 个答案:

答案 0 :(得分:6)

select type,
       sum(case when name like '% Smith' then 1 else 0 end) as SmithCount,
       sum(case when name like '% Anderson' then 1 else 0 end) as AndersonCount
    from mates
    group by type

答案 1 :(得分:1)

您需要一个数据透视表。这是一些RDBMS(Oracle,SQLServer和其他可能的人)支持的功能。

透视表允许您将值用作聚合的列。在此处查看我的帖子:How to transform vertical data into horizontal data with SQL?

数据透视表会让您获得列表中所有其他人的计数。

答案 2 :(得分:0)

您的查询已关闭,但您必须使用%而不是*作为通配符。

select type,
    sum(case when name like '%Smith' then 1 else 0 end) as SmithCount,
    sum(case when name like '%Anderson' then 1 else 0 end) as AndersonCount
group by type

答案 3 :(得分:0)

在标准SQL术语中,您建议的演示文稿不支持此功能。

标准的SQL方法是首先将数据规范化为mates.first_name,mates.last_name,然后执行:

SELECT mates.type, mates.last_name, COUNT(*) AS last_name_count
FROM mates
WHERE mates.last_name IN ('Smith', 'Anderson')
GROUP BY mates.type, mates.last_name

哪个会提供输出,例如

type last_name last_name_count
1    Anderson  3
1    Smith     1
2    Anderson  1
2    Smith     2

这与您要查找的信息相同,但格式/显示方式不同。 从历史上看,您应该在客户端应用程序中旋转/交叉显示此数据(作为表示层的一部分)。

当然很多时候在SQL层中执行此操作是有用或必要的,因此对标准进行了扩展,例如pivot(MSSQL)或crosstab(postgres)等。 ..