1

私はテーブルを持っています:

+---------+--------------------+--------------------------+
| imd_id  | Total TRx per Plan |        plan name         |
+---------+--------------------+--------------------------+
| 1111005 | 397.1556           | Medicaid Illinois (Idpa) |
| 1111005 | 25.7691            | Self Pay                 |
| 1111005 | 24.4355            | Tricare North Region     |
| 1111005 | 15.0312            | 0                        |
| 1111005 | 8.8425             | 0                        |
| 1111005 | 8.3139             | 0                        |
| 1111005 | 7.0534             | 0                        |
| 1111005 | 6.2588             | 0                        |
| 1111005 | 6.0358             | Bravo Health             |
| 1111005 | 5.9872             | 0                        |
| 1111531 | 133.9664           | Medicaid Al              |
| 1111531 | 29.2318            | 0                        |
| 1111531 | 23.2499            | 0                        |
| 1111531 | 21.9774            | 0                        |
| 1111531 | 14.9269            | 0                        |
| 1111531 | 10.1903            | Self Pay                 |
| 1111531 | 5.4962             | 0                        |
| 1111531 | 5.3409             | Bcbs Federal             |
| 1111531 | 4.4801             | 0                        |
| 1111531 | 3.8003             | 0                        |
+---------+--------------------+--------------------------+

そして、このようなデータを生成しようとしています

+---------+--------------------------+----------+---------------+-----------+----------------------+----------+
| imd_id  |      TopFirstPlan       | TopFirst | TopSecondPlan | TopSecond |    TopThirdPlan     | TopThird |
+---------+--------------------------+----------+---------------+-----------+----------------------+----------+
| 1111005 | Medicaid Illinois (Idpa) | 0.78     | Self Pay      | 0.05      | Tricare North Region | 0.04     |
| 1111531 | MEDICAID ALABAMA (AL)    | 0.5      | Self Pay      | 0.04      | Bcbs Federal         | 0.02     |
+---------+--------------------------+----------+---------------+-----------+----------------------+----------+

TOPFIRST、TOP SECOND、TOP THIRD が作成される方法は、対応するTotal TRx per Plan特定の IMD_ID の計画の合計で除算されることに注意してください。

これまでのところ、私はこれを持っています:

 select distinct a.imd_id,'topone'=
    (select top 1 totalrxperplan 
        from book1 b
      where b.imd_id =  a.imd_id)/
      (select SUM(totalrxperplan) 
        from book1 b
        where b.imd_id = a.imd_id)
      ,'topplan2'=
      (select top 1 xifinplanname 
        from book1 b
      where b.imd_id =  a.imd_id)
from book1 a
order by 1 asc

このクエリは次を返します。

+---------+--------------------------+----------+
| imd_id  |      TopFirstPlan1       | TopFirst |
+---------+--------------------------+----------+
| 1111005 | Medicaid Illinois (Idpa) | 79%      |
| 1111531 | MEDICAID ALABAMA (AL)    | 53%      |
+---------+--------------------------+----------+

しかし、他の列を追加する必要があります。

ご了承ください。ignore the plan name where it is 0

4

4 に答える 4

3
CREATE TABLE #x(imd_id INT, totalrxperplan FLOAT, xifinplanname NVARCHAR(64));

INSERT #x VALUES
(1111005,397.1556 ,'Medicaid Illinois (Idpa)'),
(1111005,25.7691  ,'Self Pay                '),
(1111005,24.4355  ,'Tricare North Region    '),
(1111005,15.0312  ,'0                       '),
(1111005,8.8425   ,'0                       '),
(1111005,8.3139   ,'0                       '),
(1111005,7.0534   ,'0                       '),
(1111005,6.2588   ,'0                       '),
(1111005,6.0358   ,'Bravo Health            '),
(1111005,5.9872   ,'0                       '),
(1111531,133.9664 ,'Medicaid Al             '),
(1111531,29.2318  ,'0                       '),
(1111531,23.2499  ,'0                       '),
(1111531,21.9774  ,'0                       '),
(1111531,14.9269  ,'0                       '),
(1111531,10.1903  ,'Self Pay                '),
(1111531,5.4962   ,'0                       '),
(1111531,5.3409   ,'Bcbs Federal            '),
(1111531,4.4801   ,'0                       '),
(1111531,3.8003   ,'0                       ');

今クエリ:

WITH cte1(id,pn,s) AS 
(
    SELECT imd_id, xifinplanname, 
      ROUND(totalrxperplan/SUM(totalrxperplan) OVER (PARTITION BY imd_id),2,1)
    FROM #x WHERE xifinplanname <> '0'
),
cte2(id,pn,s,rn) AS 
(
    SELECT id,pn,s,ROW_NUMBER() OVER (PARTITION BY id ORDER BY s DESC)
    FROM cte1
)
SELECT 
  id, 
  TopFirstPlan  = MAX(CASE WHEN rn = 1 THEN pn END),
  TopFirst      = MAX(CASE WHEN rn = 1 THEN s  END),
  TopSecondPlan = MAX(CASE WHEN rn = 2 THEN pn END),
  TopSecond     = MAX(CASE WHEN rn = 2 THEN s  END),
  TopThirdPlan  = MAX(CASE WHEN rn = 3 THEN pn END),
  TopThird      = MAX(CASE WHEN rn = 3 THEN s  END)
FROM cte2 
WHERE rn <= 3
GROUP BY id;

結果ではなく合計に '0' 計画を含めたいため、出力数値があなたのものと一致しないという私の仮定が正しい場合は、where 句をシフトするだけです。

WITH cte1(id,pn,s) AS 
(
    SELECT imd_id, xifinplanname, 
      ROUND(totalrxperplan/SUM(totalrxperplan) OVER (PARTITION BY imd_id), 2, 1)
    FROM #x -- < -- removed where clause from here
),
cte2(id,pn,s,rn) AS 
(
    SELECT id,pn,CONVERT(DECIMAL(3,2), s),ROW_NUMBER() OVER 
      (PARTITION BY id ORDER BY s DESC)
    FROM cte1 WHERE pn <> '0' -- <-- moved where clause here
)
SELECT 
  id, 
  TopFirstPlan  = MAX(CASE WHEN rn = 1 THEN pn END),
  TopFirst      = MAX(CASE WHEN rn = 1 THEN s  END),
  TopSecondPlan = MAX(CASE WHEN rn = 2 THEN pn END),
  TopSecond     = MAX(CASE WHEN rn = 2 THEN s  END),
  TopThirdPlan  = MAX(CASE WHEN rn = 3 THEN pn END),
  TopThird      = MAX(CASE WHEN rn = 3 THEN s  END)
FROM cte2 
WHERE rn <= 3
GROUP BY id;
于 2012-05-14T18:33:20.623 に答える
1

私があなたを正しく理解している場合、重要なのは、各imd_id内のグループの合計でグループを列挙することです。これは、Windows関数row_number()を使用して実行できます。

最終的なクエリは次のようになります。

select imd_id,
       max(case when therank = 1 then plan_name end) as firstplan,
       max(case when therank = 1 then tot/imd_tot end) as firstplan_ratio,
       ...
from (select t.*, row_number() over (partition by imd_id order by tot desc) as therank,
             sum(tot) over (partition by imd_id) as imd_tot
      from (select imd_id  plan_name, sum(total_trx_per_plan) as tot
            from t
            group by imd_id  plan_name
           ) t
     ) t
group by imd_id
于 2012-05-14T18:28:58.937 に答える
1

私はそのようなクエリを思いつきました:

WITH totals AS (
  SELECT imd_id, sum(t_trx_per_plan) AS ttl
    FROM plans
   GROUP BY imd_id),
ranks(imd_id,t_trx_per_plan,plan_name,prc,rank) AS (
  SELECT p.imd_id,p.t_trx_per_plan,p.plan_name,
    CAST(p.t_trx_per_plan / t.ttl * 100 AS NUMERIC(5,2)) AS prc,
    rank() OVER (PARTITION BY p.imd_id
        ORDER BY (p.t_trx_per_plan / t.ttl * 100) DESC) AS rank
    FROM plans p
    JOIN totals t ON t.imd_id = p.imd_id
   WHERE p.plan_name != '0')
SELECT
    ttl.imd_id,
    f.plan_name AS "FirstPlan",f.prc AS "First",
    s.plan_name AS "SecondPlan",s.prc AS "Second",
    t.plan_name AS "ThirdPlan",t.prc AS "Third"
  FROM totals ttl
  LEFT JOIN ranks f ON f.imd_id = ttl.imd_id AND f.rank = 1
  LEFT JOIN ranks s ON s.imd_id = ttl.imd_id AND s.rank = 2
  LEFT JOIN ranks t ON t.imd_id = ttl.imd_id AND t.rank = 3;

最初の CTEは、プランごとの合計トランザクションを含む のtotalsリストを提供しています。imd_id2 番目の CTEranksはランキング計画です。関数を使用したことに注意してください。rank()これは、プランごとに同じ数のトランザクションがある場合に等しいランキングを生成します。このようなケースを適切に処理したい場合は、ウィンドウ関数を使用して句に余分な列をrow_number()追加する必要があります。唯一の可能性は次を使用することです。ORDER BYOVER

row_number() OVER (PARTITION BY p.imd_id
    ORDER BY (p.t_trx_per_plan / t.ttl * 100) DESC, p.plan_name) AS rank

ここで出力を確認できます。

于 2012-05-14T19:14:52.737 に答える
1

IDごとの合計とは対照的に、アーロンの総合計がOPが望んでいたものであるかどうかはわかりません。基本的にアーロンが提案したものですが、小数の値が異なります。

不正なコピーを修正し、「0」ルールを説明するために更新されました。

with R1 as (
  select
    imd_id,
    [plan name],
    1e0*[Total TRx per Plan]/sum([Total TRx per Plan]) over (partition by imd_id) as pct,
    row_number() over (
      partition by imd_id
      order by case when [plan name] = '0' then -1 else [Total TRx per Plan] end desc
    ) as rn
  from @Test
) 
  select
    imd_id,
    max(case when rn=1 then [plan name] end) as TopFirstPlan,
    max(case when rn=1 then pct end) as TopFirst,
    max(case when rn=2 then [plan name] end) as TopSecondPlan,
    max(case when rn=2 then pct end) as TopSecond,
    max(case when rn=3 then [plan name] end) as TopThirdPlan,
    max(case when rn=3 then pct end) as TopThird
  from R1
  where rn <= 3
  group by imd_id
  order by imd_id
于 2012-05-14T18:38:03.670 に答える