我的数据库是为一个学校的项目,处理各种工作/合同,由顾问管理。抱歉,如果上下文含糊不清,我们也没有得到多少信息。
我目前的代码所做的是它应该做的事情,它选择顾问的名字和姓氏,它领导了最多的合同/工作。但是,我需要以特定的格式显示结果。
SELECT DISTINCT CONSULTANT_FNAME, CONSULTANT_SNAME
FROM CONSULTANT LEFT JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD
WHERE CONTRACT_LEAD IN(
SELECT CONTRACT_LEAD
FROM CONTRACT
GROUP BY CONTRACT_LEAD
ORDER BY COUNT(CONTRACT_LEAD) DESC
FETCH NEXT 1 ROWS ONLY);目前我得到的结果是:
CONSULTANT_FNAME CONSULTANT_SNAME
-------------------- --------------------
Cloud Strife然而,我需要将结果显示为“领导最多合同的顾问是:云争”。
发布于 2019-08-20 18:44:05
您不应该需要区分--您只需要将其放入其中,因为左联接会导致顾问行重复(每个顾问有多个合同),但您也不需要左联接。
SELECT
'The consultant who has led the most contracts is: ' || CONSULTANT_FNAME || ' ' || CONSULTANT_SNAME
FROM CONSULTANT
WHERE CONSULTANT_ID IN(
SELECT CONTRACT_LEAD
FROM CONTRACT
GROUP BY CONTRACT_LEAD
ORDER BY COUNT(CONTRACT_LEAD) DESC
FETCH NEXT 1 ROWS ONLY
)IN内部的子查询返回最活跃的契约牵头id,但这与顾问id相同--您不需要加入。
我相信你也可以这样做:
SELECT
'The consultant who has led the most contracts is: ' || CONSULTANT_FNAME || ' ' || CONSULTANT_SNAME
FROM
CONSULTANT
INNER JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD
GROUP BY CONSULTANT_FNAME, CONSULTANT_SNAME
ORDER BY COUNT(*) DESC
FETCH NEXT 1 ROWS ONLY之所以这样做,是因为名称上的分组实际上与id上的分组相同:它给出了契约表导致重复的次数的计数。不过,如果真的有两个同名的人,他们会把他们的合同相加在一起,这有一个小小的缺陷风险。为了解决这个问题,您可以按以下方式将consultant_id添加到组中--如果到那时您正在做组,则不能使用组中没有提到的列(除非您将它们放在聚合函数(如min、max等)中),但允许您将列放在组中,然后在select中不使用这些列。通过添加ID,我们提供了一种方法来告诉两位同名顾问将分数相加在一起:
SELECT
'The consultant who has led the most contracts is: ' || s.CONSULTANT_FNAME || ' ' || s.CONSULTANT_SNAME
FROM
CONSULTANT s
INNER JOIN CONTRACT t ON s.CONSULTANT_ID = t.CONTRACT_LEAD
GROUP BY s.CONSULTANT_FNAME, s.CONSULTANT_SNAME, s.CONSULTANT_ID
ORDER BY COUNT(*) DESC
FETCH NEXT 1 ROWS ONLY这里的最后一个学习点是:总是将表化名(我使用s和t)并使用别名。如果有人向例如合同(也称为CONSULTANT_FNAME )中添加了一个新列,这将阻止您的查询停止工作--如果没有别名,您的查询将只在列名明确时才能工作,而且db模式会随着时间的推移而更改。
添加表别名还允许您两次连接一个表,如果顾问有一个home_address_id和一个映射到addresses中两个不同行的work_address_id,那么这是非常重要的。如果您只使用home_address_id = address.id OR work_address_id = address.id一次将地址连接在一起,则最终会有两行,此时数据将更可作为一行使用。)但是,如果您对这个基本信息有更多的疑问,请参阅类似于When to use SQL Table Alias的内容
发布于 2019-08-20 18:39:25
你可以使用下面的查询-
SELECT DISTINCT 'The consultant who has led the most contracts is: ' || CONSULTANT_FNAME || ' ' || CONSULTANT_SNAME
FROM CONSULTANT LEFT JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD
WHERE CONTRACT_LEAD IN(SELECT CONTRACT_LEAD
FROM CONTRACT
GROUP BY CONTRACT_LEAD
ORDER BY COUNT(CONTRACT_LEAD) DESC
FETCH NEXT 1 ROWS ONLY);https://stackoverflow.com/questions/57579547
复制相似问题