按连接和计数的多个列排序

时间:2011-11-29 09:33:45

标签: sql sql-server tsql

我有两个表CompaniesContact,其中一对多关系,我想要 选择公司名称和联系方式以及他们的下一个订单,但它不起作用。

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id
GROUP BY comp.Name 
ORDER BY CCount desc, comp.Name desc

现在我得到的结果按联系人计数排序,但不按姓名

排序
SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id
GROUP BY comp.Name 
ORDER BY comp.Name desc, CCount desc

现在我得到按名称排序的结果,但不按计数排序

2 个答案:

答案 0 :(得分:4)

始终发布DDL和INSERT语句。这就是我所期待的。

create table companies (
  id integer primary key,
  name varchar(10)
);

create table contacts (
  id integer primary key,
  company_id integer references companies (id)
);

insert into companies values (1, 'First');
insert into companies values (2, 'Second');
insert into companies values (3, 'Third');

-- Companies 'First' and 'Third' both have 3 contacts.
insert into contacts values (100,1);
insert into contacts values (101,1);
insert into contacts values (102,1);
insert into contacts values (201,2);
insert into contacts values (301,3);
insert into contacts values (302,3);
insert into contacts values (303,3);

您的第一个查询。

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id
GROUP BY comp.Name 
ORDER BY CCount desc, comp.Name desc

name    ccount
--
Third   3
First   3
Second  1

ORDER BY CCount desc会将较大的数字放在最顶层。在每组相同的ccounts中,名称将按降序排序。 “第二个”在最后一行,因为它的ccount是1.

你的第二个问题。

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id
GROUP BY comp.Name 
ORDER BY comp.Name desc, CCount desc

name    ccount
--
Third   3
Second  1
First   3

ORDER BY comp.Name desc将按公司名称降序排序。在每组相同的公司名称中,ccounts将按降序排序。由于不能有任何相同公司名称的组(为什么?),对ccount的排序没有任何影响。

答案 1 :(得分:2)

SQL中的ORDER BY子句可以对多个列进行排序,它按顺序列出的字段进行排序,即首先按第一个字段排序,然后在字段值重复的位置按第二个字段排序


ORDER BY Name DESC,Count DESC

Smith    9
Smith    5
Smith    2
Jones    9
Doe      9

前三行有重复的名称,因此按计数

排序

ORDER BY Count DESC,名称DESC

Smith    9
Jones    9
Doe      9
Smith    5
Smith    2

前三行有重复计数,因此按名称排序


如果这些都不是您想要的,请编辑您的问题,按照您要查找的顺序添加记录的样本列表。