2016-03-25 54 views
1

我有一個要求,我必須在數據庫中執行一點計算(即在SQL查詢中)。在解釋我的要求,讓我解釋一下表結構:在SQL中的表之間的不同行和列的總和和產品

關係表

Client(k) PolicyCvg(k)  Relationship 
---------------------------------------------------- 
RAJ   1234 00  OWNER 
RAJ   1234 01  INSURED 
BRAD  ASDF 00  OWNER 
RAJ   ASDF 01  INSURED 
BRAD  ASDF 02  INSURED 
BRAD  ASDF 03  INSURED 
BRAD  ASDF 04  INSURED 
BRAD  ABCDEF00  OWNER 
BRAD  ABCDEF01  INSURED 
RAJ   ABCDEF01  INSURED 

策略表

Policy(k) Mode  MaxCvgNum 
------------------------------------------ 
1234  02  03 
ASDF  06  04 
ABCDEF  01  02 

覆蓋表

Policy(k) Cvg(k)  Amount  Tax  Risk 
---------------------------------------------------------------------- 
1234  01  500.00  2.00  HIGH 
ASDF  01  200.00  0.75  LOW 
ASDF  02  300.00  0.76  LOW 
ASDF  03  400.00  0.26  HIGH 
ASDF  03  500.00  0.78  LOW 
ABCDEF  01  1000.00  3.15  MEDIUM 
ABCDEF  02  100.00  0.03  LOW 

我的要求是在一行的Coverage表中總結AmountTax,並將其與政策表中相應的PolicyMode相乘;我們稱之爲AMT

然後總結覆蓋表中所有行的所有AMTSUM (AMT))。 要從Coverage/Policy Table中選擇一個特定的策略行,我首先會從Relationship表中選擇'BRAD'爲Owner的策略。

到目前爲止,我一直只能夠拿出下面的查詢爲每個表:

SELECT SUBSTRING(PolicyCvg,1,6) AS Policy 
FROM Relationship 
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD' 

SELECT Mode 
FROM Policy 
WHERE Policy IN (
    SELECT SUBSTRING(PolicyCvg,1,6) AS Policy 
    FROM Relationship 
    WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD' 
) 

SELECT Amount,Tax 
FROM Coverage 
WHERE Policy IN (
    SELECT SUBSTRING(PolicyCvg,1,6) AS Policy 
    FROM Relationship 
    WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD' 
) 

我輸入的是客戶,所以首先從關係表,其中獲取來自該客戶端的策略該關係是OWNER。

接下來從策略表中爲所選策略獲取模式,並從Coverage表中獲取這些策略的總金額和稅額。

現在將從覆蓋表中獲得的總和乘以策略表中的模式。將爲所有政策獲得的所有此類產品相加,並將其作爲TotalRisk的輸出。

現在我很困惑如果要構建一個複雜的聯合查詢或爲我的需求構建一個Oracle函數,而且我對這兩個領域的知識都很少。

你能幫我一下嗎?

+0

我會建議創建一個函數並從函數返回所需的輸出。 –

回答

0

如果您使用的是Oracle,你可以嘗試以下方法:

select 
    r.client 
    ,sum(c.amount) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as amount_x_mode 
    ,sum(c.tax) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as tax_x_mode 
    ,sum(c.amount) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) + sum(c.tax) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as amount_tax_x_mode 
from relationship r 

inner join policy p 
    on trim(p.policy) = trim(SUBSTRING(r.PolicyCvg,1,6)) 

inner join coverage c 
    on trim(c.policy) = trim(SUBSTRING(r.PolicyCvg,1,6)) 

where r.relationship = 'OWNER' 
    and r.client = 'BRAD' 

group by r.client 
; 

不過,我中有你可能需要的感覺,包括在CVG的加入到覆蓋表。如果是這樣,讓我知道,我可以爲你調整查詢。

+0

感謝您的回覆。它正在工作,但我需要最後添加兩個字段「amount_x_mode」和「tax_x_mode」,並將其顯示爲單個值,我試圖添加這兩個字段但不能。 另外我不需要在查詢中包含cvg,因爲我的期望是計算所有覆蓋記錄,如果該策略存在於關係表中。雖然我有一些額外的要求,說明政策表是否存在於政策表中,並且作爲「待定」狀態(引入新列)的狀態,則不應從覆蓋表中計算此類政策。 –

+0

你能否幫我一把。 –

+0

好的,我會在上面編輯我的原始答案。請將其標記爲正確的解決方案。 –