簡體   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