Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 过滤日期,但保留计算结果_Sql_Sql Server_Reporting Services - Fatal编程技术网

Sql 过滤日期,但保留计算结果

Sql 过滤日期,但保留计算结果,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,我想知道在以下情况下您可以做什么: 假设我在where子句中筛选一个日期(介于eomonth(@StartDate)和eomonth(getdate()-1)之间)。当我在没有任何筛选器的情况下运行查询时,我有一个正确的计算列,但问题是当我进行筛选时,比如说@StartDate=06/30/2017,那么计算结果将明显改变。有什么方法可以做到这一点吗 计算列是一个窗口函数 编辑: 我添加了数据的图片。因此,我使用窗口函数计算agentfourmonthperiod。您将看到它将当月和前三个月的单

我想知道在以下情况下您可以做什么:

假设我在
where
子句
中筛选一个日期(介于eomonth(@StartDate)和eomonth(getdate()-1)之间)
。当我在没有任何筛选器的情况下运行查询时,我有一个正确的计算列,但问题是当我进行筛选时,比如说
@StartDate=06/30/2017
,那么计算结果将明显改变。有什么方法可以做到这一点吗

计算列是一个窗口函数

编辑:

我添加了数据的图片。因此,我使用窗口函数计算agentfourmonthperiod。您将看到它将当月和前三个月的单位相加。我不想在筛选时更改这一点。因此,在@StartDate上筛选后,单位和agentfourmonthperiod列应保持完全相同。请e见以下数据:

我想设计一个SSRS报告,用户将在@StartDate上进行过滤,但是它应该显示计算结果,就像没有使用过滤器时一样

希望这是有意义的。否则我可以添加代码。不过它太长了

代码:


当然,您可以从查询中删除任何日期过滤器,并将其直接应用到报表的tablix中。显然,这意味着每次运行报表时SQL Server都必须返回所有数据,因此我猜这不是您想要的

要使窗口函数能够访问前3行,您必须在计算中包含前3个月的数据。为此,请将cte(
数据
)中WHERE子句中的第一个条件更改为类似以下内容:

SubmissionDates.cc_date_c 
BETWEEN 
  ISNULL(DATEADD(month, DATEDIFF(month, 0, @StartDate)-3, 0), '01/10/2015')
AND
  ISNULL(@EndDate, DATEADD(day, DATEDIFF(day, 0, GETDATE())-1, 0))
由于我认为您的日期筛选逻辑是错误的,因此我将其更改为包含该月的开始日期,而不是结束日期

现在已包括前3个月,我们可以在最后应用过滤器,将前几个月从显示中排除,但这必须在使用窗口功能后完成,例如使用另一个cte:

WITH calc AS (
    SELECT 
        IntakeMonth,
        Consultant,
        Unit,
        SUM(Unit) OVER(PARTITION BY Consultant ORDER BY Consultant ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS agentfourmonthperiod

    FROM #FillData

    WHERE ('(All)' IN (@ProvincialManager) OR (ProvManager IN (@ProvincialManager)))
      AND ('(All)' IN (@RegionalManager) OR (RegManager IN (@RegionalManager)))
      AND ('(All)' IN (@AreaSalesManager) OR (AreaSalesManager IN (@AreaSalesManager)))
      AND ('(All)' IN (@Consultant) OR (Consultant IN (@Consultant)))
    )

SELECT IntakeMonth, Consultant, Unit, agentfourmonthperiod
FROM calc 
WHERE IntakeMonth >= ISNULL(EOMONTH(@StartDate), '01/31/2016')

向我们展示一些示例数据和所需的输出。如果您的原始代码非常长,您能否将其简化为足以说明您的问题的代码?我想说的是,当前您的问题太模糊,无法回答。我们需要看一个您尝试做什么的示例。计算字段是表属性。无法通过查询进行更改..我相信eve你的意思是你在主查询中有一个子查询,对吗?是的,我在主查询中有一个子查询。我也添加了主查询。删除日期筛选器(
SubmissionDates.cc_date_c,介于COALESCE(EOMONTH(@StartDate),'01/31/2016')和COALESCE(@EndDate,GETDATE(),-1)
)从您的查询中删除,并将其放入报表的数据集中。这将使查询与所有数据一起运行,以填充窗口函数。然后,您可以稍后筛选出所需的日期。或者,您可以将上一次查询的结果放入另一个临时表中,然后使用where子句从中选择*,该子句的日期范围为非常感谢你的帮助
WITH calc AS (
    SELECT 
        IntakeMonth,
        Consultant,
        Unit,
        SUM(Unit) OVER(PARTITION BY Consultant ORDER BY Consultant ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS agentfourmonthperiod

    FROM #FillData

    WHERE ('(All)' IN (@ProvincialManager) OR (ProvManager IN (@ProvincialManager)))
      AND ('(All)' IN (@RegionalManager) OR (RegManager IN (@RegionalManager)))
      AND ('(All)' IN (@AreaSalesManager) OR (AreaSalesManager IN (@AreaSalesManager)))
      AND ('(All)' IN (@Consultant) OR (Consultant IN (@Consultant)))
    )

SELECT IntakeMonth, Consultant, Unit, agentfourmonthperiod
FROM calc 
WHERE IntakeMonth >= ISNULL(EOMONTH(@StartDate), '01/31/2016')