SQL Reporting Services,过滤字段不在DISTINCT SELECT语句中?

时间:2013-06-23 20:30:53

标签: tsql 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

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

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

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

2 个答案:

答案 0 :(得分:1)

@FreefallGeek,

如果从SELECT中删除它,你不能过滤AppointmentDate是什么意思?报表生成器允许您在运行时基于用户分配的参数进行数据集过滤,并使用此类查询

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

将@beginningofdaterange和@endofdaterange作为报表参数。除非您需要执行需要返回AppointmentDate的其他过滤,否则这应该有效。

如果您确实需要返回预约日期作为结果或进行额外过滤,那么下一个问题是当同一患者和保险公司多次访问时,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子句中的用户输入参数过滤约会。

答案 1 :(得分: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,我承认我现在没有想法。