Sco*_*ott 5 t-sql select reporting-services
我正在使用MS SQL Report Builder 3.0为SQL Reporting Services生成报告.我有一个包含AppointmentDate,PatientID和InsuranceCarrier列的数据集.我想找出在特定时间范围内访问的DISTINCT患者的数量(开始约会日期以结束约会日期).患者在查询中不止一次出现的唯一时间是他们在重复访问时是否有不同的保险公司.
如果我执行以下查询:
SELECT DISTINCT AppointmentDate, PaientID, InsuranceCarrier
FROM Encounters
WHERE AppointmentDate >= @beginningofdaterange
AND AppointmentDate <= @endofdaterange
Run Code Online (Sandbox Code Playgroud)
然后我得到在该日期范围内访问的每位患者和保险公司的清单.不幸的是,由于每个AppointmentDate也是不同的,因此患者在每个约会日期都会重复.例如,如果患者X在指定的时间范围内出现两次,则会显示两个约会.
如果我从SELECT语句中删除AppointmentDate,那么在Report Builder 3.0中的数据集属性下,我将无法再根据AppointmentDate表达式进行过滤.我可以直接在T-SQL语句的WHERE子句中进行过滤,但这意味着我无法使用用户输入的运行时报告参数.这是一个问题,因为我根据用户在运行报表时选择的报表参数进行过滤.他们输入起始的约会日期和"18个月前的"参数计算为过滤的开始和结束约会日期.
那么我如何包含AppointmentDate以便我可以使用它进行过滤,但不要将它包含在我的DISTINCT SELECT中,以便它正确地对我的数据进行DISTINCTifies.
在这种特殊情况下,我会考虑一整天的所有访问。我不会在报告中显示每个患者每天的多次就诊,而是仅将 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;
Run Code Online (Sandbox Code Playgroud)
小提琴示例 - 查看两个结果集。
如果您确实需要向用户显示整个 AppointmentDate,我承认我现在没有想法。