SSRS查询设计器中的年份SQL语句

时间:2014-04-02 15:33:18

标签: sql sql-server tsql reporting-services reporting

所以目前我有一份SSRS报告,该报告使用查找函数来比较不同的数据集,以比较2013年基数(起始年份)的当前年份。现在我想更改这些SQL数据集以生成另一个报告做一年一年的活力。因此,第一年它会给我同样的结果(因为它将比较2014年至2013年),然后明年将比较每个月的2015年至2014年。我在SSRS SQL查询设计器中执行此操作。 显示当前年份的我的SQL语句是:

SELECT        PLN.ALN, TO_CHAR(PLN.FT_DTE, 'YY/MM') AS "MM-YY", COUNT(*) AS ALT, 
                     trim(CONCAT(PLN.ALN, to_char(PLN.FT_DTE, 'YY/MM'))) AS MONTHKEY, 
                     PERFORMANCE.STATUS
FROM            PLN, PERFORMANCE
WHERE        PLN.OG = PERFORMANCE.OG AND 
                         PLN.DST = PERFORMANCE.ACT_DST AND 
                         PLN.FT_N = PERFORMANCE.FT AND 
                         PLN.FT_DTE = PERFORMANCE.FT_DT AND 
                         PLN.TIL = PERFORMANCE.ACT_TIL AND (PLN.FT_DTE BETWEEN 
                         :P_Start_Date AND :P_End_Date) AND (PLN.DST = 'FDS') AND (PERFORMANCE.STUS = 'RAR') AND 
                         (PLN.ALN IS NOT NULL)
GROUP BY PLAN.ALN, TO_CHAR(PLN.FT_DTE, 'YY/MM'), 
                         PERFORMANCE.STUS
ORDER BY PLN.ALN, "MM-YY"

这允许我指定一个日期,它将计算某个字段每月发生的次数。

现在我需要编写另一个SQL作为一个单独的数据集,它将动态地找到去年的信息(而不是像我现在一样找到2013年信息的静态数据集,而不是基础报告一年)。我假设SQL将类似于我上面写的那个,但我不确定如何让它像那样动态。基本上对于2014年,它应该找到完全相同的信息。它在2015年到来时是这个报告与另一个报告不同的时候。

1 个答案:

答案 0 :(得分:0)

我想我有适合你的解决方案:

/*  YEAR_N      :   Refers the DataSet of the year N        */
/*  YEAR_N_M_1  :   Refers the DataSet of the year N-1  */

SELECT

         YEAR_N.MONTHKEY
        ,YEAR_N.ALN
        ,YEAR_N."MM-YY"
        ,YEAR_N.ALT
        ,YEAR_N.STATUS
        ,'***' AS SEP
        ,YEAR_N_M_1.MONTHKEY
        ,YEAR_N_M_1.ALN
        ,YEAR_N_M_1."MM-YY"
        ,YEAR_N_M_1.ALT
        ,YEAR_N_M_1.STATUS
FROM
(SELECT
         PLN.ALN
        ,TO_CHAR(PLN.FT_DTE, 'YY/MM') AS "MM-YY"
        ,COUNT(*) AS ALT
        ,TRIM(CONCAT(PLN.ALN, to_char(PLN.FT_DTE, 'YY/MM'))) AS MONTHKEY
        ,PERFORMANCE.STATUS
        ,TO_NUMBER(to_char(PLN.FT_DTE, 'YY')) _YEAR
        ,to_char(PLN.FT_DTE, 'MM') _MONTH
FROM
     PLN
    ,PERFORMANCE
WHERE
        PLN.OG = PERFORMANCE.OG
AND     PLN.DST = PERFORMANCE.ACT_DST 
AND     PLN.FT_N = PERFORMANCE.FT 
AND     PLN.FT_DTE = PERFORMANCE.FT_DT
AND     PLN.TIL = PERFORMANCE.ACT_TIL
AND     (PLN.FT_DTE BETWEEN :P_Start_Date AND :P_End_Date)
AND     (PLN.DST = 'FDS')
AND     (PERFORMANCE.STUS = 'RAR')
AND     (PLN.ALN IS NOT NULL)
GROUP BY
        PLAN.ALN, TO_CHAR(PLN.FT_DTE, 'YY/MM'),PERFORMANCE.STUS) AS YEAR_N
LEFT JOIN

(SELECT
         PLN.ALN
        ,TO_CHAR(PLN.FT_DTE, 'YY/MM') AS "MM-YY"
        ,COUNT(*) AS ALT
        ,TRIM(CONCAT(PLN.ALN, to_char(PLN.FT_DTE, 'YY/MM'))) AS MONTHKEY
        ,PERFORMANCE.STATUS
        ,TO_NUMBER(to_char(PLN.FT_DTE, 'YY')) _YEAR
        ,to_char(PLN.FT_DTE, 'MM') _MONTH
FROM
     PLN
    ,PERFORMANCE
WHERE
        PLN.OG = PERFORMANCE.OG
AND     PLN.DST = PERFORMANCE.ACT_DST 
AND     PLN.FT_N = PERFORMANCE.FT 
AND     PLN.FT_DTE = PERFORMANCE.FT_DT
AND     PLN.TIL = PERFORMANCE.ACT_TIL
AND     (PLN.FT_DTE BETWEEN :P_Start_Date AND :P_End_Date)
AND     (PLN.DST = 'FDS')
AND     (PERFORMANCE.STUS = 'RAR')
AND     (PLN.ALN IS NOT NULL)
GROUP BY
        PLAN.ALN, TO_CHAR(PLN.FT_DTE, 'YY/MM'),PERFORMANCE.STUS) AS YEAR_N_M_1
    ON 
        YEAR_N._YEAR    = YEAR_N_M_1._YEAR-1
    AND YEAR_N._MONTH   = YEAR_N_M_1._MONTH

ORDER BY PLN.ALN, "MM-YY"

我希望你不是UPSET,因为我使用了你自己的代码...... 我没有在我的机器上安装ORACLE,所以你必须修改一下(我希望不会)代码。

我希望这会对你有所帮助。

祝你好运