SRSS报告,日期范围与分组依据

时间:2018-10-11 03:36:41

标签: sql sql-server reporting-services

我在SQL Server中有一个带有这些列的表FinalQuote

Q_hub_from : Perth, Burnie, Sydney etc.
Q_hub_to : Perth, Burnie, Sydney etc.
FinalMargin : 400, 500, 650 etc.
processed_at : Date Time
BookedYN : Yes/No.

我想创建一个SSRS报告,该报告将显示从特定 Q_hub_from 到特定 Q_hub_to 的所有行的 FinalMargin 平均值。还想在两列中显示平均边距:一列包含 BookedYN 为'YES'的行的平均值,另一列包含 BookedYN 为'NO'的行的平均值。当我在查询中指定日期范围(对于 processed_at )时,它工作正常并显示所需的结果。

到目前为止,我的查询是:

SELECT 
    Q_hub_from, Q_hub_to, 
    ROUND(AVG(FinalMargin), 0) AS Margin,
    COUNT(*) AS NoOfQuotesDone, 
    COUNT(CASE BookedYN WHEN 'Yes' THEN 1 ELSE NULL END) AS NoOfQuotesBooked,
    ROUND(AVG(CASE BookedYN WHEN 'No' THEN FinalMargin ELSE NULL END), 0) AS MarginWhenNotBooked, 
    ROUND(AVG(CASE BookedYN WHEN 'Yes' THEN FinalMargin ELSE NULL END), 0) AS MarginWhenBooked
FROM 
    FinalQuote
WHERE 
    Q_hub_from <> '' 
    AND Q_hub_from IS NOT NULL
    --AND CAST(processed_at as date) BETWEEN '2018-08-01' AND '2018-10-10'
    AND CAST(processed_at AS DATE) BETWEEN DATEADD(day, -10, GETDATE()) AND GETDATE()
GROUP BY 
    Q_hub_from, Q_hub_to
ORDER BY 
    Q_hub_from ASC

此查询产生以下输出:

enter image description here

但是我希望日期范围可以由用户选择,因此我添加了StartDateEndDate参数。我的processed_at列仅在WHERE子句中提到,而在select语句中没有提及,所以出现此错误:

  

[rsMissingFieldInDataSet]和[rsErrorReadingDataSetField]

当我在DataSet和GROUP BY子句中添加 processed_at 字段时,它正在工作(尽管仍显示先前的错误),但现在不会出现预期结果。它为相同的 Q_hub_from Q_hub_to 显示2行。

查询:

SELECT Q_hub_from, Q_hub_to, processed_at, ROUND(AVG(FinalMargin),0) AS Margin,
COUNT(*) AS NoOfQuotesDone, COUNT(case BookedYN when 'Yes' then 1 else null end) AS NoOfQuotesBooked,
ROUND(AVG(case BookedYN when 'No' then FinalMargin else null end),0) AS MarginWhenNotBooked, ROUND(AVG(case BookedYN when 'Yes' then FinalMargin else null end),0) AS MarginWhenBooked
FROM FinalQuote
WHERE Q_hub_from <> '' AND Q_hub_from IS NOT NULL 
AND processed_at between @StartDate AND @EndDate
GROUP BY Q_hub_from, Q_hub_to, processed_at
ORDER BY Q_hub_from ASC

输出:

enter image description here

如果有人可以帮助我实现所需的结果,即在特定日期范围内(即 processed_at <, Q_hub_from Q-hub_to 只显示1行) / em>介于 StartDate EndDate )之间,将会很有帮助。我不想显示 processed_at 列。我知道我第一次做SSRS时做错了什么。

随时询问您是否想了解更多。任何帮助将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:3)

如果尚未设置参数的值,则尝试为参数分配一些值,并确保参数类型为Date。
 你可以这样 创建数据集并将此查询放入
select DATEADD(day, -10, GETDATE()) AS StartDate, GETDATE() AS EndDate

仅在默认值部分中将此数据集用于两个参数。不要将其添加到“可用值”部分。

答案 1 :(得分:1)

建议1:在@StartDate和@EndDate之间进行AND转换(以日期为处理日期)。您需要确保此列在表中的存储方式。如果是DateTime,则隐式转换为date。 建议2:在SSRS上,确保您可以看到自己的2个参数是params。如果这样做,则不要为其设置任何值。看看是否可以选择任何随机范围并报告渲染。 建议3:如果必须放置默认值,请确保默认值是查询生成的还是存储在最佳情况下的proc生成的(有时类似于usp_report_params_defaultDateRange)。您将为此提供默认日期范围。类型也将是日期,而不是int,varchar等。 建议4:如果上述方法无法尝试建立查询并仅对值进行硬编码,则类似从表名称中选择'2000-01-01'作为Q_hub_from,选择'2001-01-01'作为Q_hub_to,其中@ StartDate和@EndDate,看看它是否有效。一次添加1列,然后锚定以进行报告并查看是否给您错误。 (注意,每次成功运行本地后,您都必须从本地Bin文件夹中删除.DATA文件)