Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按多列分组的SQL计数查询_Sql_Mysql - Fatal编程技术网

按多列分组的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