按多列分组的SQL计数查询
我有一个表,有三个填好的列,分别是“姓名”、“城市”和“职业”。 我想在同一个表中创建一个新列,其中包含拥有相同职业的人数按多列分组的SQL计数查询,sql,mysql,Sql,Mysql,我有一个表,有三个填好的列,分别是“姓名”、“城市”和“职业”。 我想在同一个表中创建一个新列,其中包含拥有相同职业的人数 "Name" | "City" | "Occupation" ------------------------------ Amy | Berlin | Plumber Bob | Berlin | Plumber Carol | Berlin | Lawyer David | London | Plumber 我想要一个包含以下内容的表: "Name"
"Name" | "City" | "Occupation"
------------------------------
Amy | Berlin | Plumber
Bob | Berlin | Plumber
Carol | Berlin | Lawyer
David | London | Plumber
我想要一个包含以下内容的表:
"Name" | "City" | "Occupation" | "Number"
---------------------------------------
Amy | Berlin | Plumber | 2
Bob | Berlin | Plumber | 2
Carol | Berlin | Lawyer | 1
David | London | Plumber | 1
创建新列的SQL查询必须是什么样子?我想在数据库中创建一个新列,以便以后访问 简单自连接:
SELECT t0.Name, t0.City, t0.Occupation, COUNT(*) AS Number
FROM sometable AS t0
JOIN sometable AS t1 ON t1.Occupation=t0.Occupation
GROUP BY t0.Name, t0.City, t0.Occupation
如果Name
是一个主键,那么您可以仅按该主键分组,因为其他列在功能上依赖于它。当然,Name
通常不是很好的主键
(如果你想知道做这项工作的其他人的人数而不是总数,你可能需要COUNT(*)-1
。这不清楚;你的例子中的数字加起来都不清楚。)
如果您必须更改模式(除非您绝对确定需要,否则我不推荐这种非规范化;请参阅注释),您可以通过加入Michael的subselect的更新来完成:
ALTER TABLE sometable ADD COLUMN Number INTEGER NOT NULL;
UPDATE sometable AS t0 JOIN (
SELECT Occupation, COUNT(*) AS Number
FROM sometable
GROUP BY Occupation
) AS t1 ON t1.Occupation=t0.Occupation
SET t0.Number= t1.Number;
我读了书名,想知道你为什么在摸索。。。认真地在上面的表格中,行是水平的,列是垂直的。例如,“艾米-柏林-水管工”是一行,而“姓名”、“城市”和“职业”“是列。谢谢,但是我希望将数字写入行中,因为每次我需要数字时进行连接可能会非常昂贵。过早优化:在需要之前不要更改您的架构。在
职业
上有一个索引,这将非常快;我可以做一个类似的自我加入和计数查询在一个网络论坛数据库的500k张贴在大约5秒。Michael的查询速度更快(尽管对于有限的结果,速度较慢);哪一个最好取决于你的数据库中到底有什么,但如果有合适的索引,两者都会很快。我的数据库中有20000000个条目,我希望进行100000次查询,我需要性能。
select tbl.name, tbl.city, tbl.occupation, x.number
from tbl
join
(
select occupation, count(*) as number
from tbl
group by occupation
) as x on x.occupation = tbl.occupation