2016-02-14 29 views
0

我有一個涉及計算列的求和的Trans-SQL相關問題。在計算列上的SQL求和

我對這些計算值進行重複計算時出現問題。

通常我會提取所有的原始數據並在Perl中進行後處理,但由於我們需要使用特定的報告系統,所以在這種情況下我無法做到這一點。我對SQL的複雜性相對缺乏經驗,所以我想我會把這個提交給專家。

我的數據被安排在以下的表(高度簡化和減少爲了清楚的目的):

Patient表:

  • PatientId
  • PatientSer

Course

  • PatientSer
  • CourseSer
  • CourseId

Diagnosis

  • PatientSer
  • DiagnosisId

Plan

  • PlanSer
  • CourseSer
  • PlanId

Field

  • PlanSer
  • FieldId
  • FractionNumber
  • FieldDateTime

我想這樣做的是找到最大比例數,在一定範圍內的FieldDateTime在FieldTable日期的最低比例數之間的差異。然後,我想將這些數值總結爲與課程相關的可能計劃ID,但我不想重複計算我可能遇到的兩個特定診斷ID(A或B或兩者)。

因此,對於具有兩個診斷代碼(A和B)和在治療的相同場(計劃1和計劃2)兩個計劃的患者,在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.

關於我能做什麼的任何想法?

+2

您的問題(極有可能)與計算列無關,與連接有關的所有事情都會產生比您所考慮的更多中間結果。 –

+0

加入查詢是無效的語法。沒有開玩笑會重複診斷如果有重複。你爲什麼甚至加入一張你不使用的桌子? – Paparazzi

+0

如果出於某種原因想要加入診斷表(例如,僅在診斷表中查找具有記錄的患者),而不是直接加入表中,請嘗試加入'(SELECT PatientSer FROM Diagnosis GROUP BY PatientSer) D' – ZLK

回答

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查詢作爲派生表和calcualte的SUM(FractionNumberDiff)有

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

爲重複計算的問題,請張貼一些示例數據和預期的結果