0

複数の行ではなく 1 つの行に日付を表​​示する SQL クエリを実行しようとしています。また、表示される各日付間の日数を決定する必要があります。

現在のクエリの下を見つけてください。

SELECT "Pat_Name",
    CASE WHEN "vw_Schedule"."Activity" = '123'
THEN "vw_Schedule"."App_DtTm"
ELSE NULL
END as Consult,
    CASE WHEN "vw_Schedule"."Activity" = '456'
THEN "vw_Schedule"."App_DtTm"
ELSE NULL
END as SIM,
    CASE WHEN "vw_Schedule"."Activity" = '789'
THEN "vw_Schedule"."App_DtTm"
ELSE NULL
END as PLANNING,
CASE WHEN "vw_Schedule"."SysDefStatus" = 'SC'
          THEN "vw_Schedule"."App_DtTm"
         ELSE NULL
END as TreatmentStart,
          CASE WHEN "vw_Schedule"."SysDefStatus" = 'FC'
          THEN "vw_Schedule"."App_DtTm"
       ELSE NULL   
   END as TreatmentFinished
FROM "vw_Schedule"
WHERE  "vw_Schedule"."Activity"='123' 
or "vw_Schedule"."Activity"='456'
or "vw_Schedule"."Activity"='789'
or "vw_Schedule"."SysDefStatus"='SC'
or "vw_Schedule"."SysDefStatus"='FC'

出力が以下のようになることを願っています

Pat_Name | Consult  | Days |    SIM   | Days |  PLANNING | Days | TreatmentStart | Days |  TreatmentFinish

Test Pat | 1/9/2013 |   4  | 5/9/2013 |  10  | 15/9/2013 |  3   |    18/9/2013   |   7  |  25/9/2013

ご協力いただきありがとうございます。

4

1 に答える 1

0

pat_Name ごとのアクティビティごとに 1 つの行しかないことを保証できる場合は、集約関数を安全に使用して、各 pat_name のアクティビティごとに App_dtTm を取得できます。データが失われる心配はありません。重複がない場合は、MIN と MAX のどちらを使用しても問題ありません。

SELECT  s.Pat_Name,
        Consult = MAX(CASE WHEN s.Activity = '123' THEN s.App_DtTm END),
        SIM = MAX(CASE WHEN s.Activity = '456' THEN s.App_DtTm END),
        PLANNING = MAX(CASE WHEN s.Activity = '789' THEN s.App_DtTm END),
        TreatmentStart = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.App_DtTm END),
        TreatmentFinished = MAX(CASE WHEN s.SysDefStatus = 'FC' THEN s.App_DtTm END)
FROM    vw_Schedule s
WHERE   s.Activity IN ('123', '456', '789')
OR      s.SysDefStatus IN ('SC', 'FC')
GROUP BY s.Pat_Name;

1 つのアクティビティに重複した日付を設定できる場合は、MIN と MAX のどちらを使用するかによって違いが生じます。

アクティビティ間の日数を取得するには、上記のクエリを共通のテーブル式 (または必要に応じてサブクエリ) に移動し、作成した列を参照するだけです。

WITH T AS
(   SELECT  s.Pat_Name,
            Consult = MAX(CASE WHEN s.Activity = '123' THEN s.App_DtTm END),
            SIM = MAX(CASE WHEN s.Activity = '456' THEN s.App_DtTm END),
            PLANNING = MAX(CASE WHEN s.Activity = '789' THEN s.App_DtTm END),
            TreatmentStart = MAX(CASE WHEN s.SysDefStatus = 'SC' THEN s.App_DtTm END),
            TreatmentFinished = MAX(CASE WHEN s.SysDefStatus = 'FC' THEN s.App_DtTm END)
    FROM    vw_Schedule s
    WHERE   s.Activity IN ('123', '456', '789')
    OR      s.SysDefStatus IN ('SC', 'FC')
    GROUP BY s.Pat_Name
)
SELECT  Pat_Name,
        Consult,
        Days = DATEDIFF(DAY, Consult, SIM),
        SIM,
        Days = DATEDIFF(DAY, SIM, PLANNING),
        PLANNING,
        Days = DATEDIFF(DAY, PLANNING, TreatmentStart),
        TreatmentStart,
        Days = DATEDIFF(DAY, TreatmentStart, TreatmentFinish),
        TreatmentFinish
FROM    T;
于 2013-10-09T09:15:26.600 に答える