SSRS 报告中的月份和年份选项参数

Month and Year options parameter in SSRS report

--您好,

我想知道是否有一种方法可以让用户有选择 select 日期范围以月 (mm/dd/yyyy) 或年 (yyyy)...(例如使用下拉列表)

比如……

如果用户在预览模式下从下拉列表中select "DateByMonth",则用户可以输入月份的日期范围。

开始日期: 1/1/2014 结束日期: 1/1/2016

输出应该是这样的。

    1/2014  | 2/2014 | 3/2014 | .... | 10/2015 | .... | 1/2016|
qty   1         6        9                3               6
rev   2         3        2                12              0 

如果用户在预览模式下从下拉列表中select "DateByYear",则用户可以输入年份的日期范围。

开始日期: 2014 结束日期: 2016

输出应该是这样的。

    2014 | 2015 | 2016
qty 16     3      6
rev 7      12     0

您可能有更好的解决方案。

谢谢。

我曾经用选择显示类型的参数制作报告(每日、每周、每月、每年或每季度)

并且我在 DataSet 中使用 Expression 进行动态查询。

这是我的数据集中的一些表达式

="DECLARE @paramSdate AS DATE = @Strdate "&
"DECLARE @paramNdate AS DATE = @endDate "&
Switch(
Parameters!displayType.Value = "D",
    .... Generate Daily into temp table .....
Parameters!displayType.Value = "W" ,
    .... Generate weekly into temp table ......
Parameters!displayType.Value = "M" ,
    .... Generate monthly into temp table ......
Parameters!displayType.Value = "Y",
    .... Generate yearly into temp table ......
Parameters!displayType.Value = "Q",
    .... Generate quarter into temp table .......
)

我使用 displayType 参数来确定使用什么查询。

这只是指南,不是完整的代码。

更新 1

好的..感谢您创建脚本 table 和数据

看起来你期望的结果必须使用 UNPIVOT

我每月和每年进行样本 2 查询

每月

DECLARE @paramSdate AS DATE = CAST('2015-02-01' AS DATE)
DECLARE @paramNdate AS DATE = CAST('2015-09-30' AS DATE)
DECLARE @temp AS DATE = @paramSDate

CREATE TABLE #tmp (label VARCHAR(10),m INT,yy INT)
 -- Monthly
WHILE @temp < @paramNdate
BEGIN
    INSERT INTO #tmp
        SELECT FORMAT(@temp,'MM/yyyy'),MONTH(@temp),YEAR(@temp)
    SET @temp = DATEADD(MONTH,1,@temp)
END

;WITH CTE 
AS
(
    SELECT upv.col
        ,upv.yy
        ,upv.m
        ,upv.value
    FROM (
        SELECT t.label
            ,t.m
            ,t.yy
            ,ISNULL(val.Qty,0) AS [Qty]
            ,ISNULL(val.Rev,0) AS [Rev]
        FROM #tmp t
        LEFT JOIN (
            SELECT CAST(Rev AS INT) AS [Rev]
                ,CAST(Qty AS INT) AS [Qty]
                ,MONTH(DateDA) AS [mm]
                ,YEAR(DateDA) AS [yyy]
            FROM Main_Table m with(nolock)
            WHERE m.DateDA BETWEEN  CAST('2/13/2015' AS DATE) AND  CAST('9/23/2015' AS DATE)
        ) val ON val.mm = t.m AND val.yyy = t.yy
    ) src
    UNPIVOT
    (
        value
        FOR col IN ([Rev],[Qty])
    ) upv
)

SELECT CTE.col
    ,CAST(CTE.m AS varchar(10)) + '/' + CAST(CTE.yy AS varchar(10)) AS [label]
    ,CTE.value
FROM CTE
ORDER BY CTE.yy,CTE.m

DROP TABLE #tmp

解释:首先,我为生成日期范围记录创建临时 table 然后使用 UNPIVOT 得到如下图所示的结果

最后,我像这样在 SSRS 中使用分组

当 运行

你会得到这个结果

对于“每年”,我每月进行的查询都是相同的

每年

DECLARE @paramSdate AS DATE = CAST('2015-02-01' AS DATE)
DECLARE @paramNdate AS DATE = CAST('2017-09-30' AS DATE)
DECLARE @temp AS DATE = @paramSDate

CREATE TABLE #tmp (yy INT)
 -- Yearly
WHILE YEAR(@temp) <= YEAR(@paramNdate)
BEGIN
    INSERT INTO #tmp
        SELECT YEAR(@temp)
    SET @temp = DATEADD(YEAR,1,@temp)
END

;WITH CTE 
AS
(
    SELECT upv.col
        ,upv.value
        ,upv.yy
    FROM (
        SELECT t.yy
            ,ISNULL(val.Qty,0) AS [Qty]
            ,ISNULL(val.Rev,0) AS [Rev]
        FROM #tmp t
        LEFT JOIN (
            SELECT CAST(Rev AS INT) AS [Rev]
                ,CAST(Qty AS INT) AS [Qty]
                ,YEAR(DateDA) AS [yy]
            FROM Main_Table m with(nolock)
            WHERE m.DateDA BETWEEN  CAST('2/13/2015' AS DATE) AND  CAST('9/23/2017' AS DATE)
        ) val ON val.yy = t.yy
    ) src
    UNPIVOT
    (
        value
        FOR col IN ([Rev],[Qty])
    ) upv
)


SELECT CTE.col
    ,CTE.yy AS [label]
    ,CTE.value
FROM CTE 

DROP TABLE #tmp

然后如果你想为用户 select 显示类型使用参数你可以使用这样的查询

DECLARE @displayType NVARCHAR(100) = @param

IF @displayType = 'DateByMonth' 
BEGIN
    ..... Code for Monthly ......
END
ELSE
BEGIN
    ..... Code for Yearly ......
END

希望对您有所帮助。