SQL:分组依据 - 具有最大数量的其他属性

时间:2015-10-23 08:58:29

标签: mysql sql group-by

我是SQL的新手,面临以下问题:

这是我的表:

name   city  people
-----|-----|--------|
John | A   | 5      | 
Ben  | D   | 6      | 
John | A   | 5      | 
Ben  | A   | 5      | 
John | B   | 8      | 
Ben  | D   | 6      |

我希望按名称分组并收到与数量最多的城市名称相关联的内容。作为第二个查询,而不是最大数量,这个城市拥有最多的居民。

这将是第一个查询的结果:

name   city 
-----|-----|
John | A   |
Ben  | D   |

谢谢!

3 个答案:

答案 0 :(得分:1)

试试这个,我试过根据你的样本数据制作一个表,

CREATE TABLE KaiTable
(
    NAME       VARCHAR(50)
   ,city       CHAR(1)
   ,people     INT
);

INSERT INTO KaiTable
VALUES
  (
    'John'
   ,'A'
   ,5
  ),
('Ben ' ,'D' ,6),
('John' ,'A' ,5),
('Ben ' ,'A' ,5) ,
('John' ,'B' ,8) ,
('Ben ' ,'D' ,6) 

SELECT NAME,city 
FROM 
    (SELECT NAME,city,SUM(people) AS PeopleSum 
    FROM KaiTable 
    GROUP BY NAME, city 
    ORDER BY NAME ASC, PeopleSum DESC) AS a 
GROUP BY NAME DESC;

SQL Fiddle Demo

答案 1 :(得分:0)

SELECT name, city, sum( people )
FROM `detail`
GROUP BY name
ORDER BY people ASC
LIMIT 0 , 30

我不太明白你的期望,但我想你想做这件事。

描述:我是由那里的人组成的团体,得到了人的总和并使他们成为ASC命令。我不确定你是否期待这件事。

你也可以按照他们的城市对人进行分组

SELECT name, city, sum( people )
FROM `detail`
GROUP BY city
ORDER BY people ASC
LIMIT 0 , 30

如果这不是您所期望的,请进一步描述问题,我们会尝试给出一些答案。

enter image description here

答案 2 :(得分:0)

我不确切地知道你的意思是“以最大数量的城市名称”。我理解的是你把每对夫妇(姓名,城市)的“人”列加起来,因此(约翰,A)将是10而(约翰,B)将是8,你取最大值得到(约翰,A )。

在这种情况下,您可以这样做:

SELECT 
    name, 
    city 
FROM 
    (SELECT 
        name, 
        city, 
        SUM(people) AS tot 
    FROM table 
    GROUP BY name, city 
    ORDER BY name ASC, tot DESC) AS a 
GROUP BY name ;

对于居民人数最多的城市,你只需要按城市分组,然后对列人进行总结并采取最大值:

SELECT 
    city, 
    SUM(people) AS nb_inhabitants 
FROM table 
GROUP BY city 
ORDER BY nb_inhabitants DESC 
LIMIT 1;