【问题标题】:SQL Query to show gaps between multiple date ranges for REPORT BUILDER 3.0用于显示 REPORT BUILDER 3.0 的多个日期范围之间的间隔的 SQL 查询
【发布时间】:2018-02-20 23:30:43
【问题描述】:

我有一个使用 SQL Server Management Studio 2008 2 Simple charts: 1. Showing DistinctCount of all visits to a walk in clinic by month/day for the last 30 days; and, 2. Showing the same but counting only those visits with a police escort 在 Report Builder 3.0 中创建的报告

我遇到的问题是,并非每天都有警察护送 - 所以有些日子没有 NULL 值,但完全不见了!

我已经找到了几个使用 SSRS 来解决这个问题的方法,但是它们太复杂了,我无法切换到报表生成器(我都是新手)。有人可以指导我如何在报表生成器中解决此问题吗?

注意:我无法添加或更改表(我具有只读访问权限),因此这些选项已失效。显示如何添加临时表的说明听起来很有趣,但对我来说太复杂了——这是两个表的代码(我不知道如何为两个表做一个数据集——当我将第二个 tablix 限制为只是警察,它搞砸了第一个tablix)。

请记住,我是新手,我使用的是 Report Builder 而不是 SQL。谢谢。

ServiceByDatesHrly

​​>
SELECT
    ClientChartPartition.ClientChartPartitionID AS [ClientChartPartition ClientChartPartitionID]
    ,ClientChartPartition.ClientChartID AS [ClientChartPartition ClientChartID]
    ,ClientChart.ClientChartID AS [ClientChart ClientChartID]
    ,VisitPlan.VisitPlanID
    ,VisitPlan.ClientChartPartitionID AS [VisitPlan ClientChartPartitionID]
    ,VisitPlan.VisitDate
    ,VisitPlan.ServiceTypeDesc
    ,Name.ParticipantID
    ,Name.LastName 
FROM
    ClientChartPartition 
    INNER JOIN
        ClientChart 
        ON ClientChartPartition.ClientChartID = ClientChart.ClientChartID 
    INNER JOIN
        VisitPlan 
        ON ClientChartPartition.ClientChartPartitionID = VisitPlan.ClientChartPartitionID 
    INNER JOIN
        Name 
        ON Name.ParticipantID = ClientChartPartition.ClientChartPartitionID 
    WHERE
    Name.LastName NOT LIKE N'TestClient%' 

警察护送

SELECT
    VisitPlan.VisitPlanID
    ,VisitPlan.ClientChartPartitionID
    ,VisitPlan.VisitDate
    ,VisitPlan.ServiceTypeDesc
    ,FormRelation.ParentRelationID
    ,FormRelation.ChildRelationID
    ,Form.FormID
    ,Field.ParentID
    ,Field.FieldIndexCode
    ,Field.ResultXML
    ,Name.ParticipantID
    ,Name.LastName 
FROM
    VisitPlan 
    INNER JOIN
        FormRelation 
        ON VisitPlan.VisitPlanID = FormRelation.ParentRelationID 
    INNER JOIN
        Form 
        ON FormRelation.ChildRelationID = Form.FormID 
    INNER JOIN
        Field 
        ON Form.FormID = Field.ParentID 
    INNER JOIN
        Name 
        ON VisitPlan.ClientChartPartitionID = Name.ParticipantID 
WHERE
    VisitPlan.ServiceTypeDesc = N'MAPP_REFDATA_VISIT_PLAN_TYPE_WALK_IN_SERVICE' 
    AND Name.LastName NOT LIKE N'TestClient' 
    AND Form.FormTemplateID = N'ab395124-679a-4e7c-b98d-d9a9c11cb2a3'  --Mental Health and Physical Health Screen
    AND Field.FieldIndexCode = N'CRC_0070a' -- Mental Health and Physical Health Screen
    AND Field.ResultXML LIKE N'%<value>2</value>%'  -- Police

【问题讨论】:

  • 您的系统是否维护一张类似“日历”的表格,定义一天是一个假期、工作日等?
  • 如果您可以访问日期表或创建带有日期的表,您可以轻松完成此操作。将您的结果交叉连接到此表,您应该能够用 0 填充空日期您的数据集.. 尝试使用 SSRS 仅用于呈现数据.. 不对其进行操作.. 将其留给数据集。
  • 不幸的是,我无法添加任何内容 - 它是一个只读数据库(对我而言)。据我所知,系统中没有日历表。我会问我的系统管理员,但如果他们以他们通常的方式回答,那将是“我们不支持...” Fussimist

标签: reporting-services ssrs-2008 reportbuilder3.0


【解决方案1】:

您将需要某种日期表,然后您只需将现有数据 LEFT JOIN 加入其中。最好的方法是创建一个永久的日期表,但如果这不可能,那么您可以在 SSRS 数据集中临时创建一个。

假设您当前的数据集查询类似于

SELECT VisitDate, COUNT(*) AS Vists FROM mytable GROUP BY VisitDate

那我们就可以这样修改了。

WITH tmpDates AS (
  SELECT CAST('2018-01-21' AS DATETIME) AS dt
  UNION ALL
  SELECT DATEADD(dd, 1, dt)
    FROM tmpDates td
   WHERE DATEADD(dd, 1, dt) <= CAST('2018-02-20' AS DATETIME)
  )
SELECT td.dt as VisitDate, COUNT(*) as Visits
  FROM tmpDates td
  LEFT JOIN mytable m on td.dt = m.VisitDate
GROUP BY VisitDate

显然您可以将日期作为参数传递。

基本上,我们在这里所做的是创建一个 CTE,它只是将一堆日期联合起来,每个日期都比前一个日期晚一天。它不是很有效,但对于像你这样的小日期范围来说会很好。然后我们选择所有这些记录并按日期左加入您的原始表,然后按日期分组/计数。如果您的原始表中不存在特定日期的数据,那么您将返回一行,其中包含日期和 0 计数。

【讨论】:

  • 这听起来很有希望,但对我来说太复杂了 - 请参阅我修改后的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
相关资源
最近更新 更多