在计算列

时间:2016-02-14 19:31:19

标签: sql-server tsql

我有一个与Trans-SQL相关的问题,涉及计算列的总结。

我遇到了重复计算这些计算值的问题。

通常我会提取所有原始数据并在Perl中对其进行后处理,但由于我们需要使用特定的报告系统,我不能在这种情况下这样做。我对SQL的复杂性相对缺乏经验,所以我想我会把它提交给专家。

我的数据安排在下表中(为了清楚起见,高度简化和简化):

Patient表:

  • PatientId
  • PatientSer

Course

  • PatientSer
  • CourseSer
  • CourseId

Diagnosis

  • PatientSer
  • DiagnosisId

Plan

  • PlanSer
  • CourseSer
  • PlanId

Field

  • PlanSer
  • FieldId
  • FractionNumber
  • FieldDateTime

我想要做的是找到FieldTable中FieldDateTime中日期范围内的最大分数和最小分数之间的差异。我想将这些值与可能的与课程相关的计划ID相加,但我不想重复计算我可能遇到的两个特定诊断ID(A或B或两者)。

因此,对于具有两个诊断代码(A和B)且在同一疗程(Plan1和Plan2)中有两个计划的患者,第一个计划的分数为24,第二个计划的分数为5我想出去是这样的:

 - **PatientId  CourseId PlanId DiagnosisId  FractionNumberDiff  Sum
 - AB1234       1        Plan1  A            24                  29
 - AB1234       1        Plan1  B            *                   *
 - AB1234       1        Plan2  A            5                   * 
 - AB1234       1        Plan2  B            *                   * 

我绞尽脑汁想如何做到这一点,我尝试了以下几点:

SELECT 
    Patient.PatientId,
    Course.CourseId,
    Plan.PlanId,
    MAX(fractionnumber OVER PARTITION(Plan.PlanSer)) - MIN(fractionnumber OVER PARTITION(Plan.PlanSer)) AS FractionNumberDiff,
    SUM(FractionNumberDiff OVER PARTITION(Course.CourseSer)
FROM
    Patient P
INNER JOIN
    Course C ON (P.PatientSer = C.PatientSer)
INNER JOIN
    Plan Pl ON (Pl.CourseSer = C.CourseSer)
INNER JOIN
    Diagnosis D ON (D.PatientSer = P.PatientSer)
INNER JOIN
    Field F ON (F.PlanSer = Pl.PlanSer)
WHERE
    FieldDateTime > [Start Date]
    AND FieldDateTime < [End Date]

但这只是对诊断代码的重复计算,这意味着我最终得到的是58而不是29。

关于我能做什么的任何想法?

1 个答案:

答案 0 :(得分:0)

将FractionNumberDiff更改为

MAX(fractionnumber) OVER (PARTITION BY Plan.PlanSer) -
MIN(fractionnumber) OVER (PARTITION BY Plan.PlanSer) AS FractionNumberDiff

并删除“SUM(FractionNumberDiff OVER PARTITION(Course.CourseSer)”

将exisitng查询作为派生表进行计算并计算SUM(FractionNumberDiff)

SELECT *, SUM(FractionNumberDiff) OVER ( PARTITION BYCourse.CourseSer)
FROM
(
   < the modified existing query here>
) AS d

关于重复计算问题,请发布一些样本数据和预期结果