2013-06-29 73 views
1

我需要一些幫助。我需要從這3個表中獲取數據並創建如下所示的輸出。導出plan_name_xpending_tallyx列,以便爲每個聲明標識一行。每個索賠ID可以關聯到多達3個計劃,並且我想要顯示每個計劃和計數金額在一個記錄中。做這個的最好方式是什麼?SQL Server:取1到多個記錄集併爲每個ID創建1條記錄

感謝您的任何想法。 :)

需要

輸出結果集:

claim_id ac_name  plan_name_1 pending_tally1 plan_name_2  Pending_tally2 plan_name_3 pending_tally3 
-------- -------  ----------- -------------- -----------  -------------- ----------- -------------- 
1234  abc cooks delux_prime 22    prime_express 23    standard_prime 2 
2341  zzz bakers delpux_prime 22    standard_prime 2    NULL   NULL 
3412  azb pasta's prime_express 23    NULL   NULL   NULL   NULL 

SQL Server 2005的表使用了上述結果集:

company_claims

claim_id ac_name  
1234  abc cooks 
2341  zzz bakers 
3412  azb pasta's 

claim_plans

claim_id plan_id  plan_name 
1234  101  delux_prime 
1234  102  Prime_express 
1234  103  standard_prime 
2341  101  delux_prime 
2341  103  standard_prime 
3412  102  Prime_express 

Pending_amounts

claim_id plan_id  Pending_tally 
1234  101  22 
1234  102  23 
1234  103  2 
2341  101  22 
2341  103  2 
3412  102  23 

回答

0

如果你知道3總是計劃那麼一些左的聯接將正常工作的最大金額:

select c.claim_id, c.ac_name, 
     cp1.plan_name as plan_name_1, pa1.pending_tally as pending_tally1, 
     cp2.plan_name as plan_name_2, pa2.pending_tally as pending_tally2, 
     cp3.plan_name as plan_name_3, pa3.pending_tally as pending_tally3, 
from company_claims c 
left join claim_plans cp1 on c.claim_id = cp1.claim_id and cp1.planid = 101 
left join claim_plans cp2 on c.claim_id = cp2.claim_id and cp2.planid = 102 
left join claim_plans cp3 on c.claim_id = cp3.claim_id and cp3.planid = 103 
left join pending_amounts pa1 on cp1.claim_id = pa1.claimid and cp1.planid = pa1.plainid 
left join pending_amounts pa2 on cp2.claim_id = pa2.claimid and cp2.planid = pa2.plainid 
left join pending_amounts pa3 on cp3.claim_id = pa3.claimid and cp3.planid = pa3.plainid 
+0

感謝Hogan,可以將計劃編號分配給成千上萬的索賠編號,但只有三個,所以我不認爲我可以參加計劃ID = 101等.... .1000+對不起,我應該更加清楚。 :( –

+0

@Montwill所有時間都會更快(即使這3個變化很容易加入到描述它們的表格中 - 如果需要,我可以告訴你),但如果您需要「動態」那麼樞紐是一個更好的(但更難)的選擇。 – Hogan

0

我會首先加入所有的數據,以便獲得相關列:claim_id, ac_name, plan_name, pending tally

然後我想補充改造這個來得到不同的行計劃名稱和計劃相符,與標籤綁在一起。

然後它應該很容易樞軸轉動。

我會將它們與公共表格表達式結合在一起。

這裏的查詢:

with X as (
    select cc.*, cp.plan_name, pa.pending_tally, 
    rank() over (partition by cc.claim_id order by plan_name) as r 
    from company_claims cc 
    join claim_plans cp on cp.claim_id = cc.claim_id 
    join pending_amounts pa on pa.claim_id = cp.claim_id 
    and pa.plan_id = cp.plan_id 
), P as (
    select 
     X.claim_id, 
     x.ac_name, 
     x.plan_name as value, 
     'plan_name_' + cast(r as varchar(max)) as label 
    from x 
    union all 
    select 
     X.claim_id, 
     x.ac_name, 
     cast(x.pending_tally as varchar(max)) as value, 
     'pending_tally' + cast(r as varchar(max)) as label 
    from x 
) 
select claim_id, ac_name, [plan_name_1], [pending_tally1],[plan_name_2], [pending_tally2],[plan_name_3], [pending_tally3] 
from (select * from P) p 
pivot (
    max(value) 
    for label in ([plan_name_1], [pending_tally1],[plan_name_2], [pending_tally2],[plan_name_3], [pending_tally3]) 
) as pvt 
order by pvt.claim_id, ac_name 

這裏顯示的行動是一個小提琴:http://sqlfiddle.com/#!3/68f62/10

+0

感謝jtsend,我很抱歉,如果我誤解你的答案,但我想獲得與SQL腳本的輸出,而不必移動到excel樞軸表等... –

+0

@Montwill我在談論SQL的PIVOT,而不是Excel的PIVOT。 –

+0

@Montwill我用查詢和小提琴更新了我的答案。 –

相關問題