繁体   English   中英

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

[英]How do I display my query results as part of a string?

我的数据库用于学校项目,并处理顾问执行的各种工作/合同。 如果上下文含糊,我们深表歉意,我们也没有得到太多帮助。

我当前的代码执行了预期的工作,它选择了负责最多合同/工作的顾问的姓和名。 但是,我需要以特定格式显示结果。

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

但是,我需要将结果显示为“领导合同最多的顾问是:Cloud Strife”。

您不需要DISTINCT-您只需将其放在那里,因为LEFT JOIN会导致顾问行重复(每位顾问有多个合同),但是您也不需要左联接

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分组实际上是相同的:它提供了合同表导致重复的次数的计数。 但是,如果确实存在两个同名的人,他们的合同会加在一起,因此存在一个小错误风险。 为了解决这个问题,您可以在group by中添加consultant_id-如果您要按group进行分组,则不能使用SELECT区域中未在group by中提及的列(除非您将它们放在诸如min,max之类的聚合函数中等等),但允许您将列放在该组中,然后在选择中不使用它们。 通过添加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)并使用别名。 如果有人将新列添加到合同(例如也称为CON​​SULTANT_FNAME的合同)中,这将防止您的查询停止工作-如果没有别名,则您的查询仅在列名明确且数据库架构随时间变化时才起作用

添加表别名还可以使一个表两次连接,这对于例如顾问的home_address_id和work_address_id映射到地址表中的两个不同行非常重要。 如果使用home_address_id = address.id OR work_address_id = address.id仅将地址加入一次,那么当数据将更有用时,您将得到两行。 到这里结束sql 101 :),但是如果您对此信息有更多疑问,请参阅何时使用SQL表别名

您可以使用以下查询-

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM