首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将查询结果显示为字符串的一部分?

如何将查询结果显示为字符串的一部分?
EN

Stack Overflow用户
提问于 2019-08-20 18:23:57
回答 2查看 416关注 0票数 0

我的数据库是为一个学校的项目,处理各种工作/合同,由顾问管理。抱歉,如果上下文含糊不清,我们也没有得到多少信息。

我目前的代码所做的是它应该做的事情,它选择顾问的名字和姓氏,它领导了最多的合同/工作。但是,我需要以特定的格式显示结果。

代码语言:javascript
复制
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);

目前我得到的结果是:

代码语言:javascript
复制
CONSULTANT_FNAME     CONSULTANT_SNAME
-------------------- --------------------
Cloud                Strife

然而,我需要将结果显示为“领导最多合同的顾问是:云争”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-20 18:44:05

您不应该需要区分--您只需要将其放入其中,因为左联接会导致顾问行重复(每个顾问有多个合同),但您也不需要左联接。

代码语言:javascript
复制
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相同--您不需要加入。

我相信你也可以这样做:

代码语言:javascript
复制
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,我们提供了一种方法来告诉两位同名顾问将分数相加在一起:

代码语言:javascript
复制
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的内容

票数 1
EN

Stack Overflow用户

发布于 2019-08-20 18:39:25

你可以使用下面的查询-

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57579547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档