无法从去年的特定时间间隔累积数据

时间:2015-06-12 08:32:59

标签: sql sql-server tsql

我试图从SQL查询中累积金额。输入@STARTDATE@ENDDATE是日期时间类型(YYYYMMDD) 所以Case语句检查验证日期是否在特定日期之间。

案例陈述的一些解释: 工作正常:
CURRENT_YEAR_ACC,累计当年从年初到@ENDDATE的验证数量

CURRENT_YEAR_MONTHS,@ STARTDATE和@ENDDATE之间的累积金额。

PREVIOUS_YEAR_MONTH,去年累计金额@STARTDATE -1年和@ENDDATE -1年。

不起作用:

PREVIOUS_YEAR_ACC,应计算去年年初(20XX-01-01)至@ENDDATE -1yr。

这里我得到的值与PREVIOUS_YEAR_MONTH

相同
   sum (RAW_DATA.CURRENT_YEAR_MONTH) as PERIOD_I_AR,
   sum (RAW_DATA.PREVIOUS_YEAR_MONTH) as PERIOD_FG_AR,
   sum (RAW_DATA.CURRENT_YEAR_ACC) as ACK_I_AR,
   sum (RAW_DATA.PREVIOUS_YEAR_ACC) as ACK_FG_AR
from (SELECT rehuv.[KD1] as VST_nr, rekod.BEN as VST_ben,
   rehuv.KONTO as Konto_nr, rektk.KONTO_BEN as Konto_ben,
   lresk.LEV_NR as LEV_nr, rehuv.TEXT as LEV_ben, rehuv.VER_DATUM
   as DATUM, case when rehuv.VER_DATUM > = dateadd (month,
   - datepart (month, @STARTDATE) + 1, @STARTDATE)
   and rehuv.VER_DATUM < = @ENDDATE then rehuv.BELOPP else 0 end
   as CURRENT_YEAR_ACC,
   case when rehuv.VER_DATUM > = dateadd (YEAR, - 1, dateadd (MONTH, - datepart (MONTH, @STARTDATE) + 1, @STARTDATE)) and rehuv.VER_DATUM < = DATEADD (year, - 1, @ENDDATE) 
then rehuv.BELOPP else 0 end as PREVIOUS_YEAR_ACC,
   case when rehuv.VER_DATUM > = @STARTDATE
   and rehuv.VER_DATUM < = @ENDDATE then rehuv.BELOPP else 0 end
   as CURRENT_YEAR_MONTH,
   case when rehuv.VER_DATUM > = DATEADD (year, - 1, @STARTDATE)
   and rehuv.VER_DATUM < = DATEADD (year, - 1,
   @ENDDATE) then rehuv.BELOPP else 0 end
   as PREVIOUS_YEAR_MONTH FROM [FTG0001].[dbo].[REHUV]

1 个答案:

答案 0 :(得分:0)

我建议遵循KISS原则(简单地保持愚蠢)。

我认为最好的方法是在每个时间段制作一个子查询 - 在此期间过滤。对值求和并将它们与内部连接连接在一起并提取所需的列(总和列)。那么多案件都会让它变慢。

也许您需要在日期列上使用索引来进一步提高性能。但这需要在您的环境中进行测试。