0

したがって、この質問は私が以前に尋ねた質問と似ていますが、少し異なります。

プログラムに入院し、プログラムから退院したクライアントのデータを見ています。入院と退院のたびに評価が行われ、採点されます。時には、期間中に複数回入院と退院が行われることもあります。

入院と退院のそれぞれについて、入院から退院までに一定量改善したすべてのクライアントを確認できるように、各クライアントの入院スコアと次の退院日をペアリングできる必要があります。

これは、私のデータ結果が現在どのようにフォーマットされているかのダミーサンプルです: 前

そして、これは私が理想的にフォーマットしたい方法です: ここに画像の説明を入力

しかし、すべてのクライアントの入院スコアと退院スコアのすべてのインスタンスを比較できるようにする正しい方向または同様の書式設定のヘルプに任意のポイントを取ります。

ありがとう!

4

3 に答える 3

2

結果を取得するには、UNPIVOT と PIVOT 関数の両方を適用できます。UNPIVOT は と の複数の列を行に変換し、dateそれらscoreの行をピボットして列に戻すことができます。

アンピボットの構文は次のようになります。

select person,
  casenumber,
  ScoreType+'_'+col col,
  value,
  rn
from
(
  select person,
    casenumber,
    convert(varchar(10), date, 101) date,
    cast(score as varchar(10)) score,
    scoreType,
    row_number() over(partition by casenumber, scoretype
                      order by case scoretype when 'Admit' then 1 end, date) rn            
  from yourtable
) d
unpivot
(
  value
  for col in (date, score)
) unpiv

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| PERSON | CASENUMBER |             COL |      VALUE | RN |
-----------------------------------------------------------
|    Jon |       3412 |  Discharge_date | 01/03/2013 |  1 |
|    Jon |       3412 | Discharge_score |         12 |  1 |
|     Al |       3452 |      Admit_date | 05/16/2013 |  1 |
|     Al |       3452 |     Admit_score |         15 |  1 |
|     Al |       3452 |  Discharge_date | 08/01/2013 |  1 |
|     Al |       3452 | Discharge_score |         13 |  1 |

ご覧のとおり、このクエリは、ピボットするための新しい列も作成します。したがって、最終的なコードは次のようになります。

select person, casenumber,
  Admit_Date, Admit_Score, Discharge_Date, Discharge_Score
from
(
  select person,
    casenumber,
    ScoreType+'_'+col col,
    value,
    rn
  from
  (
    select person,
      casenumber,
      convert(varchar(10), date, 101) date,
      cast(score as varchar(10)) score,
      scoreType,
      row_number() over(partition by casenumber, scoretype
                        order by case scoretype when 'Admit' then 1 end, date) rn

    from yourtable
  ) d
  unpivot
  (
    value
    for col in (date, score)
  ) unpiv
) src
pivot
(
  max(value)
  for col in (Admit_Date, Admit_Score, Discharge_Date, Discharge_Score)
) piv;

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| PERSON | CASENUMBER | ADMIT_DATE | ADMIT_SCORE | DISCHARGE_DATE | DISCHARGE_SCORE |
-------------------------------------------------------------------------------------
|     Al |       3452 | 05/16/2013 |          15 |     08/01/2013 |              13 |
|  Cindy |       6578 | 01/02/2013 |          17 |     03/04/2013 |              14 |
|  Cindy |       6578 | 03/04/2013 |          14 |     03/18/2013 |              12 |
|    Jon |       3412 |     (null) |      (null) |     01/03/2013 |              12 |
|  Kevin |       9868 | 01/18/2013 |          19 |     03/02/2013 |              15 |
|  Kevin |       9868 | 03/02/2013 |          15 |         (null) |          (null) |
|   Pete |       4765 | 02/06/2013 |          15 |         (null) |          (null) |
|  Susan |       5421 | 04/06/2013 |          19 |     05/07/2013 |              15 |
于 2013-05-03T15:00:41.753 に答える