我有一個涉及計算列的求和的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.
關於我能做什麼的任何想法?
您的問題(極有可能)與計算列無關,與連接有關的所有事情都會產生比您所考慮的更多中間結果。 –
加入查詢是無效的語法。沒有開玩笑會重複診斷如果有重複。你爲什麼甚至加入一張你不使用的桌子? – Paparazzi
如果出於某種原因想要加入診斷表(例如,僅在診斷表中查找具有記錄的患者),而不是直接加入表中,請嘗試加入'(SELECT PatientSer FROM Diagnosis GROUP BY PatientSer) D' – ZLK