5

我正在使用 MS SQL Report Builder 3.0 为 SQL Reporting Services 生成报告。我有一个数据集,其中包括 AppointmentDate、PatientID 和 InsuranceCarrier 列。我想找出在特定时间范围内访问的 DISTINCT 患者的数量(从 AppointmentDate 开始到 AppointmentDate 结束)。患者在查询中出现多次的唯一情况是他们是否有不同的保险公司进行重复访问。

如果我执行以下查询:

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

然后我得到在该日期范围内访问的每个患者和保险公司的列表。不幸的是,由于每个 AppointmentDate 也是不同的,因此对于每个单独的约会日期,Patients 都会重复。例如,如果患者 X 在指定的时间范围内出现两次,它将显示两个约会。

如果我从 SELECT 语句中删除 AppointmentDate,那么在 Report Builder 3.0 的数据集属性下,我将无法再根据 AppointmentDate 表达式进行筛选。我可以直接在 T-SQL 语句的 WHERE 子句中进行过滤,但这意味着我不能使用用户输入的运行时报告参数。这是一个问题,因为我根据用户在运行报告时选择的报告参数进行过滤。他们输入开始的 AppointmentDate 和“18 个月前”参数计算为要过滤的开始和结束 AppointmentDates。

那么如何包含 AppointmentDate 以便我可以使用它进行过滤,但不将其包含在我的 DISTINCT SELECT 中,以便它正确区分我的数据。

4

2 回答 2

1

@FreefallGeek,

如果您将 AppointmentDate 从 SELECT 中删除,您无法过滤它是什么意思?报表生成器允许您在运行时根据用户分配的参数进行数据集过滤,查询如下,

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

使用 @beginningofdaterange 和 @endofdaterange 作为您的报告参数。这应该可以工作,除非您需要执行需要返回 AppointmentDate 作为结果的额外过滤。

如果您确实需要返回 Appointment Date 作为结果或进行额外过滤,那么下一个问题是,当同一患者和保险公司多次就诊时 AppointmentDate 应该是什么?日期范围内的第一次访问还是最后一次访问?如果是这种情况,您可以像这样使用 group by 进行首次访问,

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

但是,根据您的描述,您似乎只需要能够过滤日期的不同患者和保险公司。如果这种理解是正确的,您可以在没有 SELECT 的情况下在 WHERE 子句中使用用户输入参数过滤约会。

于 2013-06-24T03:12:22.543 回答
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;

Example Fiddle - 查看两个结果集。

如果您真的需要向用户显示整个 AppointmentDate,我承认我现在不知道。

于 2013-06-23T22:37:07.390 回答