我试图从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]
答案 0 :(得分:0)
我建议遵循KISS原则(简单地保持愚蠢)。
我认为最好的方法是在每个时间段制作一个子查询 - 在此期间过滤。对值求和并将它们与内部连接连接在一起并提取所需的列(总和列)。那么多案件都会让它变慢。
也许您需要在日期列上使用索引来进一步提高性能。但这需要在您的环境中进行测试。