-1

私の問題に対する適切なクエリを見つけるのに苦労しているようです。

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

患者の運動 (PatientID,ExerciseID,StartDate,EndDate)-first 3 are PK

患者の病歴 (PatientID,ExerciseID,CompletionDate) -all 3 are PK

2 つのクエリを作成しようとしています。

最初のクエリは、特定の患者の 1 週間 (日単位) の運動完了率を返す必要があり、2 番目のクエリは、3 か月間 (週単位) で同じことを行う必要があります。

例えば ​​:

PatientExercise: このテーブルに重複する日付はありません(PatientExercise)

PatientID ExerciseID  StartDate    EndDate
---------------------------------------------
111           13     2013-04-28   2013-08-28
111           14     2013-04-28   2013-08-28
111           16     2013-04-28   2013-05-07
111           17     2013-05-09   2013-08-28
222           13     2013-04-28   2013-08-28
222           14     2013-04-28   2013-08-28
.
.
.

患者の病歴

PatientID ExerciseID  CompletionDate 
------------------------------------
111           13     2013-04-28 
111           13     2013-05-05 
111           14     2013-05-05
111           13     2013-05-06 
111           14     2013-05-06
111           13     2013-05-07 
111           14     2013-05-07
111           16     2013-05-07 
111           13     2013-05-08 

週の開始日が 2013-05-05 である患者 ID 111 のクエリ 1 の結果:

day            Completion
-------------------------------
2013-05-05        66%             ->> there are 3 exe's that has to be done on this date (13,14,16) and according to history he did only 2 (13,14) so 2/3 = 66%
2013-05-06        66%
2013-05-07       100%
2013-05-08        50%  
2013-05-09         0%
2013-05-10         0%
2013-05-11         0%

2 番目のクエリでも同じですが、日ではなく --> 週です。

ありがとうございました!

4

2 に答える 2

0

これを試してください:

;WITH ExercisesNeeded AS(
SELECT
    PatientID,
    COUNT(1) ExercisesNeeded
FROM PatientExercise
WHERE '2013-05-05' BETWEEN StartDate AND EndDate
GROUP BY PatientID
),
ExercisesDone AS(
SELECT PatientID,
       CompletionDate,
       COUNT(ExerciseID) ExercisesDone
FROM PatientHistory
GROUP BY PatientID,
         CompletionDate
)
SELECT
    ED.PatientID,
    CompletionDate,
    ExercisesDone * 100 / NULLIF(ExercisesNeeded, 0) AS PercentDone
FROM ExercisesNeeded EN
JOIN ExercisesDone ED
    ON ED.PatientID = EN.PatientID
WHERE CompletionDate >= '2013-05-05'

SQL フィドル

于 2013-05-07T10:30:04.747 に答える
0

このクエリを試してください

必要に応じて週フィルターを追加します。

クエリ 1 :

select CONVERT(datetime,CompletionDate), 100*count(*)/(select count(*) from tbl1
                            where CONVERT(datetime,CompletionDate) 
                                   between CONVERT(datetime,StartDate) 
                                   and CONVERT(datetime,EndDate) and PatientID=111) as completionRate
from 
  tbl2 b
where PatientID=111
group by CONVERT(datetime,CompletionDate)

SQLフィドル

|         DATE(COMPLETIONDATE) | COMPLETIONRATE |
-------------------------------------------------
| April, 28 2013 00:00:00+0000 |        33.3333 |
|   May, 05 2013 00:00:00+0000 |        66.6667 |
|   May, 06 2013 00:00:00+0000 |        66.6667 |
|   May, 07 2013 00:00:00+0000 |            100 |
|   May, 08 2013 00:00:00+0000 |             50 |

: これは最適化された方法ではありませんが、機能します。また、0 を調べる必要があります。そうしないと、0 による除算エラーがスローされます。

于 2013-05-07T08:03:46.430 に答える