2017-04-18 72 views
0

我需要創建一個SQL查詢,從小於最低收益經理SQL查詢困境

這裏的薪水的代理檢索提成和工資的總和我的查詢到目前爲止,我收到一個空白表:

SELECT AgentName, 
     Salary, 
     Commission, 
     (SELECT sum(Premium) 
     From Policy,PolicyCover 
     WHERE AgentNo IN (Select AgentNo From Policy)) As [Total Premium] 
FROM Agent,Policy,PolicyCover 
WHERE (Select sum(Salary+Commission) 
     From Agent) < 
     (Select Min(Salary) 
     From 
     Agent Where Function= "Manager") 
+7

請發佈這些數據庫表的結構 – gaganshera

+2

首先不要使用逗號分隔的連接。你似乎是一個初學者,所以誰教你使用在1992年**中被重複使用的連接語法?然後你一次又一次從相同的表格中選擇。您的子查詢甚至與主查詢沒有關係。 –

+1

您被要求顯示錶格結構。請這樣做。什麼專欄屬於哪個表?什麼是表的主鍵? (順便說一下:請添加MS Access標籤,我不能因爲有待編輯,請不要在沒有標記DBMS的情況下詢問SQL問題。) –

回答

0

難道這不簡單嗎?

select (salary + commission) "sum of commission and salary" 
from agent 
where (salary + commission) < (select min(salary) from agent where function = 'Manager') 
+0

否我不允許將薪水+佣金作爲表中的屬性添加 –

1

你是初學者,所以我覺得如果我向你展示一個prêt-à-porter查詢,那麼它就沒有多大的幫助。相反,我會告訴你你的查詢做了什麼。

您正在使用過時的連接語法。您可以用顯式關鍵字CROSS JOIN替換表名之間的逗號。所以,你的主查詢有:

FROM Agent, Policy, PolicyCover 

它轉換爲

FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover 

和手段:從代理抓住每一個記錄,並從政策的每條記錄將它們結合起來,然後把結果行,並與每一個將它們結合起來記錄在PolicyCover中。假設代理有100條記錄,策略200和PolicyCover 300.這使得100 x 200 x 300組合= 6,000,000行。

我們的WHERE條款:

WHERE (Select sum(Salary+Commission) From Agent) < 
     (Select Min(Salary) From Agent Where Function = "Manager") 

所以,你選擇工資加commison從代理的總和。然後你從代理商中選擇最低工資,這當然低於所有工資總額(加上佣金)。所以病情從未得到滿足。您不選擇記錄。

如果您有條件滿足的WHERE子句,您將從無數行組合行中選擇一些列加上一定數量的溢價值。讓我們看看這個子查詢:你交叉加入Policy和PolicyCover,從而創建所有組合。在WHERE中,確保您從Policy表中獲得的AgentNo存在於策略表中。那麼,這當然是真的。

第一件事:學習正確的連接(INNER JOIN ... ON ...開始)。考慮與表相關的內容,並只加入相關記錄(例如,使用相同的保單號)。

接下來的事情:在處理多個表格時,使其符合您的列的使用習慣。例如Premium是Policy還是PolicyCover?通過指定表名來明確這一點:SUM(PolicyCover.Premium)。或者使用表別名:FROM PolicyCover pcSUM(pc.Premium)

+0

我試過使用交叉連接方法,它不起作用 –

+0

「不工作」說什麼都沒有。你是說當你用FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover代替'FROM Agent,Policy,PolicyCover'時,你會得到一個語法錯誤? –

+0

是的。我們被告知使用Microsoft Office Access的方式 –