让我们考虑一下这个表:
[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/上学习了教程,但是只有很少的基础知识,任何“更多”复杂的查询。有人有一些有用的链接吗?感谢。
答案 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)等。 ..