1

助けが必要です。これら 3 つのテーブルからデータを取得し、以下のような出力を作成する必要があります。plan_name_xおよび列は、pending_tallyx請求 ID ごとに 1 行を作成するために派生されます。各請求 ID は最大 3 つのプランに関連付けることができ、各プランと集計金額を 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

保留中の金額

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

2 に答える 2

0

最初にすべてのデータを結合して、関連する列を取得します: claim_id, ac_name, plan_name, pending tally.

次に、transform this を追加して、異なる行で計画名と計画集計を取得し、ラベルでそれらを結び付けます。

そうすれば、ピボットが簡単になるはずです。

これらを共通のテーブル式で結び付けます。

クエリは次のとおりです。

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

于 2013-06-29T17:36:24.657 に答える