2013-06-23 41 views
5

我正在使用MS SQL Report Builder 3.0爲SQL Reporting Services生成報告。我有一個數據集,其中包括AppointmentDate,PatientID和InsuranceCarrier列。我想了解在特定時間範圍內訪問的DISTINCT患者的數量(開始約會日期到結束約會日期)。在詢問中患者應該多次出席的唯一時間是如果他們在重複訪問時有不同的保險承運人。SQL Reporting Services,對不在DISTINCT SELECT語句中的字段進行篩選?

如果我執行下面的查詢:

SELECT DISTINCT AppointmentDate, PaientID, InsuranceCarrier 
FROM Encounters 
WHERE AppointmentDate >= @beginningofdaterange 
AND AppointmentDate <= @endofdaterange 

然後我得到的是,在該日期範圍內訪問的每個病人和保險公司的名單。不幸的是,由於每個AppointmentDate也是不同的,所以患者會在每個單獨的約會日期得到重複。例如,如果患者X在指定的時間範圍內顯示兩次,則會顯示兩個約會。

如果我從我的SELECT語句中刪除AppointmentDate,然後在數據集屬性在Report Builder 3.0中我不能再過濾器基礎上,AppointmentDate表達。我可以直接在T-SQL語句的WHERE子句中進行篩選,但這意味着我無法使用用戶輸入的運行時報表參數。這是一個問題,因爲我基於用戶在運行報表時選擇的報表參數進行篩選。他們輸入起始AppointmentDate,並將「18個月前」參數計算爲開始和結束AppointmentDates進行過濾。

那麼,如何包括AppointmentDate,這樣我可以用它進行過濾,但使其正常DISTINCTifies我的數據不包括在我的SELECT DISTINCT。

+2

這是一個很好的問題,我個人很感興趣學習正確的答案(或任何數量的工作建議)。但是,關於應用程序(報告工具),更具體地說,關於如何使用該應用程序(而不是其安裝,配置等),我相信這個問題並不屬於DBA.SE,它是關於與DBMS的服務器端相關的事情,以及關於DBMS具有的任何內置客戶端工具的配置。因此,我正在標記將此遷移到[so]。 –

回答

0

在這種特殊情況下,我會考慮每個全天的所有訪問。而不是顯示每個病人每天多次遇到,我會去作爲AppointmentDate僅顯示AppointmentDate本身的一天部分的報告。由於過濾可能不需要訪問的確切時刻,而只是發生的事實。結果集將被報告過濾。

您的特定選擇將如下所示:

-- small modification (take encounters by entire day): 
SELECT DISTINCT 
    CAST(e.AppointmentDate as Date) as AppointmentDateDay, -- the day of the visit 
    e.PatientID, 
    e.InsuranceCarrier, 
    COUNT(e.Id) as CntVisits -- display them if you'd like 
FROM Encounters as e 
WHERE AppointmentDate >= '20130624 10:00:00' 
AND AppointmentDate <= '20130625 18:00:00' 
GROUP BY PatientID, InsuranceCarrier, CAST(e.AppointmentDate as Date) 
ORDER BY PatientId; 

Fiddle - 看到兩個結果集。

如果你真的需要整個AppointmentDate展現給用戶,我承認我沒有想法了。

1

@FreefallGeek,

你是什麼,你的意思是,如果你從選擇刪除它無法過濾AppointmentDate?報表生成器允許你做基於在運行時,像這樣的查詢用戶指定的參數數據集過濾,

SELECT DISTINCT PaientID, InsuranceCarrier 
FROM Encounters 
WHERE 
    AppointmentDate >= @beginningofdaterange 
    AND AppointmentDate <= @endofdaterange 

隨着@beginningofdaterange和@endofdaterange作爲報表參數。這應該工作,除非你需要做額外的過濾,因此需要返回AppointmentDate。

如果你真的需要返回的約會日期的結果或額外的濾波,那麼接下來的問題是什麼應該是當有多個訪問與同一患者和保險公司的AppointmentDate?第一次訪問還是在日期範圍內最後一次訪問?如果是這樣的話,你可以通過這樣的第一次訪問使用組,

SELECT Min(AppointmentDate) AS FirstAppointmentDate, PaientID, InsuranceCarrier 
FROM Encounters 
WHERE 
    AppointmentDate >= @beginningofdaterange 
    AND AppointmentDate <= @endofdaterange 
GROUP BY PaientID, InsuranceCarrier 
ORDER BY AppointmentDate 

不過,從你的描述,似乎你只需要在不同的病人和保險公司有能力來篩選日期。如果這種理解是正確的,那麼您可以僅使用WHERE子句中的用戶輸入參數過濾約會,而不使用SELECT。