2017-05-30 88 views
1

我目前正在使用一些數據,顯示所有在診所接受過某種類型程序的患者。該程序類別由多個代碼組成,每個代碼代表屬於該類別的更具體的程序。診所的質量措施規定患者應在一定的時間內完成這些手術之一;問題在於,他們每個人都有不同的標準,關於他們何時可能發生以便出於質量目的進行計數。帶有多個CASE語句的SQL查詢

讓我分解它,並希望解釋它好一點。假設我們有3個代碼,每個都代表一種程序。

CODE DESCRIPTION 
-------------------- 
1234 Basic procedure 
5678 Intermediate procedure 
9012 Thorough procedure 

現在,這些類型的程序都有自己的時間表。基本版本必須在過去一年內完成才能進行計數。中間一個可以從過去的任何時候開始四個年,而一個完整的一個好的爲十個年。因此,2014年有中間程序的患者仍將計入質量目標,2009年完全程序的患者仍將計數。

我有我的基本查詢:

SELECT DISTINCT 
    PatientID, 
    PatientAge, 
    ProcedureCode, 
    CodeDescription, 
    ServiceDate, 
    RenderingProvider, 
    VisitType 

FROM ServiceDetail 

WHERE ProcedureCode IN ('1234','5678','9012') 

(是的,程序代碼存儲爲VARCHAR處理,因爲在實際的數據庫中某些是字母和數字)

現在,我想成爲能夠使用IF/THEN/ELSE邏輯來執行某些操作,這在SQL中是一種CASE語句,除非我錯了),可以查看代碼的類型,過程發生的服務日期以及確定是否程序用於質量目的。

實施例的僞代碼:

IF ProcedureCode = 5678 
AND ServiceDate is between [GETDATE() minus 4 years] and GETDATE() 
THEN Yes 

有會是對於兩個其它程序類型與各自的時限相同的語句。我希望查詢只在這些情況返回true時才顯示結果。

我的問題是,我知道什麼我需要做的,但我的SQL是生鏽的,我不知道怎麼做到這一點。基本上我正在尋找關於語法的提示。

+0

是否有這些服務細節的唯一ID? – scsimon

+0

@scsimon有一個訪問ID字段可用於此目的,是的,雖然我沒有將它包括在我的查詢中 – EJF

+0

您需要查詢'ServiceDetail'表嗎?它的結構是什麼? – gaganshera

回答

1

你並不真的需要這種情況下,只會讓你的查詢複雜。你可以簡單地使用和/或像

SELECT DISTINCT 
    PatientID, 
    PatientAge, 
    ProcedureCode, 
    CodeDescription, 
    ServiceDate, 
    RenderingProvider, 
    VisitType 

FROM ServiceDetail 

WHERE (ProcedureCode = '1234' and ServiceDate Between getdate() AND DATEADD(year, -1, getdate()) OR 
(ProcedureCode = '5678' and ServiceDate Between getdate() AND DATEADD(year, -2, getdate()) ... 
+0

好吧,好像這可能是更簡單的選擇。現在我似乎在做什麼可能會成爲一個非常明顯的錯誤,但SQL Server的錯誤是非特定的......我繼續前進並按照自己的方式嘗試,但是WHERE子句的每個部分位於不同的行上。在我的每個OR下面都有一個紅色的波浪曲線。意識到我需要在每行的末尾添加一個右括號。每個OR的紅色波浪消失了,但是現在每個新的圓括號都有一個...... – EJF

+0

你得到的錯誤是什麼? – gaganshera

+0

對不起,快點擊回車 - 查看編輯過的評論 – EJF

1

where 
    (procedureCode = '1234' AND ServiceDate 
     Between DATEADD(year, -1, getdate()) and getdate()) 
or 
    (procedureCode = '5678' AND ServiceDate 
     Between DATEADD(year, -4, getdate()) and getdate()) 
or 
    .. etc 
+1

在這兩種情況之間缺少第二部分......'(... dateadd(...)和getdate()之間)' – scsimon

+1

哎呀,謝謝,:) – Phil

+0

沒問題,但現在你錯過了一個關閉每一個括號。 :) – scsimon

1

這應該爲您的where子句

WHERE 
    ProcedureCode IN ('1234','5678','9012') 
    AND VisitID IN 
    (select VisitID 
    from ServiceDetail 
    where ServiceDate >= 
     case 
     when ProcedureCode = 1234 then dateadd(year,-1,getdate()) 
     when ProcedureCode = 5678 then dateadd(year,-4,getdate()) 
     when ProcedureCode = 9012 then dateadd(year,-10,getdate()) 
     end) 
    and ServiceDate <= getdate() 

工作什麼,或者你可以明確地使用OR運營商爲您的where子句中的每一種情況下。自從您明確要求後,我給了CASE表達式。

如果你選擇直接的辦法來解決別人的語法錯誤......

WHERE 
    (ProcedureCode = '1234' and ServiceDate Between DATEADD(year, -1, getdate()) and getdate()) 
OR 
    (ProcedureCode = '5678' and ServiceDate Between DATEADD(year, -2, getdate()) and getdate()) 
etc...