0

値の範囲を変換するピボット テーブルを作成しようとしています。私はこの合計トリックを使用していますが、最近ピボット演算子について学び、データをピボットテーブルに変換しようとしています。コードはその方が保守しやすいかもしれません。(データを少し隠すためにテーブルの名前を変更しました)

        select  consultation_id,
                sum(case when current_status_id in (3,4,5,9,10,16,17,18,24,25,26) then 1 else 0 end) [Phase1],
                sum(case when current_status_id in (4,9,10,16,17,18) then 1 else 0 end) [Phase2],
                sum(case when current_status_id in  (10,16,17,18) then 1 else 0 end) [Phase3],
                sum(case when current_status_id = 24 then 1 else 0 end) [Rejected],
                sum(case when current_status_id in (17,18) then 1 else 0 end) [Complete]    
        from subject with (NOLOCK,NOWAIT)
        where ACTIVE_IND = 1
        group by consultation_id

変換を行う方法について提案がある人はいますか?

編集: 基本的に、相談の段階に到達した被験者数の集計を作成しています。これは、ユーザーが特定のデータを検索できるように、lucene インデックス用に作成された集計です。生の表形式データの例と、出力がどのように見えるかを次に示します::

select  consultation_id,
                sum(case when current_status_id in (3,4,5,9,10,16,17,18,24,25,26) then 1 else 0 end) [Phase1],
                sum(case when current_status_id in (4,9,10,16,17,18) then 1 else 0 end) [Phase2],
                sum(case when current_status_id in  (10,16,17,18) then 1 else 0 end) [Phase3],
                sum(case when current_status_id = 24 then 1 else 0 end) [Rejected],
                sum(case when current_status_id in (17,18) then 1 else 0 end) [Complete]    
        from (values(1588054,11928257,3,1),
                (1588054,11928256,10,1),
                (1588054,11928255,10,1),
                (1588054,11928254,4,1),
                (1588052,11928233,2,1),
                (1588052,11928232,3,0),
                (1588052,11928231,10,1),
                (1588052,11928230,18,1),
                (1588052,11928229,24,1),
                (1588052,11928228,24,1)) subject (consultation_id,subject_id,current_status_id,active_ind)
        where ACTIVE_IND = 1
        group by consultation_id
4

1 に答える 1

1

これを に変換したい場合は、決定しようとしているのそれぞれのPIVOTを含むテーブルを作成することをお勧めします。idPhases

create table phases
(
  id int,
  name varchar(10)
);

次にJOINsubjectテーブルを のこの新しいテーブルに移動します。これにより、次のデータcurrent_status_idが可能になります。PIVOT

select s.consultation_id,
  p.name
from subject s
left join phases p
  on s.current_status_id = p.id
where s.ACTIVE_IND = 1

したがって、最終的なクエリは次のようになります。

select *
from 
(
  select s.consultation_id,
    p.name
  from subject s
  left join phases p
    on s.current_status_id = p.id
  where s.ACTIVE_IND = 1
) src
pivot
(
  count(name)
  for name in ([Phase1], [Phase2], [Phase3], [Rejected], [Complete])
) piv;

デモで SQL Fiddle を参照してください

結果は既存のクエリと一致します。

| CONSULTATION_ID | PHASE1 | PHASE2 | PHASE3 | REJECTED | COMPLETE |
--------------------------------------------------------------------
|         1588052 |      4 |      2 |      2 |        2 |        1 |
|         1588054 |      4 |      3 |      2 |        0 |        0 |

テーブルを使用する利点は、current_status_id必要な がさらにある場合、それをテーブルに追加するだけで、クエリを変更しなくてもカウントされることです。

于 2012-11-09T20:55:58.827 に答える