在SQL Query中使用声明的变量时出错

时间:2015-07-01 12:34:34

标签: sql ssrs-2008

我的cnsmr_accnt_id付款可以追溯到几个月前。我希望看到过去4个月的每月付款总额。像这样:

Cnsmr_accnt_id   |   Wrkgrp_nm    |  Apr15_Tot  |  May15_Tot  |  Jun15_Tot  |  Jul15_Tot
12345            |Workgrp1        |  123424     |  1243255    |  232342     |  23232323
12347            |Workgrp4        |  123323     |  1244455    |  324342     |  232323

我正在尝试使用Pivot来执行此操作,但在使用以下代码时仍然出现错误。我怀疑它与变量@Dates范围有关。

@Dates给我的价值4月15日,5月15日,6月15日,7月15日这是正确的。

如果我直接将其替换为@Dates中的Select,则查询有效。但是当我使用@Dates时,它会出错。 ('@Dates'附近的语法不正确。)

我也尝试将用于Set @Dates的整个“公式”放入select语句中,但这也会产生错误。 (关键字'left'附近的语法不正确)

Declare @Dates as nvarchar(max); 
--Builds up a string of dates for the last 4 months. 
Set @Dates = left(datename(Month, datefromparts(year(dateadd(month, -3, getdate())), month(getdate())-3, 1)), 3) + 
 right(datename(year, datefromparts(year(dateadd(month, -3, getdate())), month(getdate())-3, 1)), 2) + ',' +
 left(datename(Month, datefromparts(year(dateadd(month, -2, getdate())), month(getdate())-2, 1)), 3) + 
 right(datename(year, datefromparts(year(dateadd(month, -2, getdate())), month(getdate())-2, 1)), 2)+ ',' +
 left(datename(Month, datefromparts(year(dateadd(month, -1, getdate())), month(getdate())-1, 1)), 3) + 
 right(datename(year, datefromparts(year(dateadd(month, -1, getdate())), month(getdate())-1, 1)), 2)+ ',' +
 left(datename(Month, getdate()), 3) + 
 right(datename(year, getdate()), 2);

 --Print @dates
--Example output = Apr15,May15,Jun15,Jul15

--Use a pivot to get the totals per cnsmr_accnt_id for the last 4 months. 
Select *
 from
(
Select  
    capj.cnsmr_accnt_id,
    wrkgrp_nm,
    max(UDEFINST_AMT) as Instlmnt,
    sum(cnsmr_accnt_pymnt_amnt) as Mnth_Tot, 
--Gives the Month & year (Eg Jul15)
    left(datename(Month, cnsmr_accnt_pymnt_pstd_dt), 3) + right(datename(year, cnsmr_accnt_pymnt_pstd_dt), 2) as Month_Yr
from 
    dbo.cnsmr_accnt_pymnt_jrnl capj  
        inner join 
    UDEFGENERAL UG 
        on 
        capj.cnsmr_accnt_id = UG.cnsmr_accnt_id
        Inner join
    wrkgrp w 
        on
        capj.wrkgrp_id = w.wrkgrp_id
where
cnsmr_accnt_pymnt_stts_cd in (5)
and cnsmr_accnt_pymnt_pstd_dt between
--Go back to the 1st day 4 months back
datefromparts(year(dateadd(month, -3, getdate())), month(getdate())-3, 1)
and 
getdate()
group by capj.cnsmr_accnt_id, 
left(datename(Month, cnsmr_accnt_pymnt_pstd_dt), 3) + right(datename(year, cnsmr_accnt_pymnt_pstd_dt), 2), 
 wrkgrp_nm) as Mnth_Tot_Tbl
 pivot 
 (
 sum(Mnth_Tot) 
 for 
 Month_Yr in (@Dates)) as Piv

4 个答案:

答案 0 :(得分:0)

您需要使用动态sql或在(@Dates)中使用以下而不是Month_Yr

','+@Dates+',' like '%,'+Month_Yr+',%' 

答案 1 :(得分:0)

如果您想要过去4个月的数据,我建议您采用不同的方式,而不是按月和年分组,按本月的月数分组。因此,您只需转动静态数字(0,1,2,3),而不是尝试动态转动;

SELECT  *
FROM    (   SELECT  capj.cnsmr_accnt_id,
                    wrkgrp_nm,
                    Instlmnt = MAX(udefinst_amt),
                    Mnth_Tot = SUM(cnsmr_accnt_pymnt_amnt), 
                    MonthsSinceToday = DATEDIFF(MONTH, cnsmr_accnt_pymnt_pstd_dt, GETDATE())
            FROM    dbo.cnsmr_accnt_pymnt_jrnl AS capj  
                    INNER JOIN Udefgeneral AS ug
                        ON capj.cnsmr_accnt_id = ug.cnsmr_accnt_id
                    INNER JOIN wrkgrp AS w 
                        ON capj.wrkgrp_id = w.wrkgrp_id
            WHERE   cnsmr_accnt_pymnt_stts_cd IN (5)
            AND     cnsmr_accnt_pymnt_pstd_dt >= DATEADD(MONTH, DATEDIFF(MONTH, '19000401', GETDATE()), '19000101')
            AND     cnsmr_accnt_pymnt_pstd_dt < GETDATE()
            GROUP BY cnsmr_accnt_id, wrkgrp_nm, DATEDIFF(MONTH, cnsmr_accnt_pymnt_pstd_dt, GETDATE())
        ) AS d
        PIVOT 
        (   SUM(Mnth_Tot)
            FOR MonthsSinceToday IN ([0], [1], [2], [3])
        ) AS pvt;

这种方法的缺点是您的日期不会成为列标题,但好处是您不需要使用动态sql,并且您的表示层应该相当容易地处理列名称

答案 2 :(得分:0)

 First Convert second part into dynamic string  and create string query after execute your Query
EXEC('Select *
 from
(
Select  
    capj.cnsmr_accnt_id,
    wrkgrp_nm,
    max(UDEFINST_AMT) as Instlmnt,
    sum(cnsmr_accnt_pymnt_amnt) as Mnth_Tot, 
--Gives the Month & year (Eg Jul15)
    left(datename(Month, cnsmr_accnt_pymnt_pstd_dt), 3) + right(datename(year, cnsmr_accnt_pymnt_pstd_dt), 2) as Month_Yr
from 
    dbo.cnsmr_accnt_pymnt_jrnl capj  
        inner join 
    UDEFGENERAL UG 
        on 
        capj.cnsmr_accnt_id = UG.cnsmr_accnt_id
        Inner join
    wrkgrp w 
        on
        capj.wrkgrp_id = w.wrkgrp_id
where
cnsmr_accnt_pymnt_stts_cd in (5)
and cnsmr_accnt_pymnt_pstd_dt between
--Go back to the 1st day 4 months back
datefromparts(year(dateadd(month, -3, getdate())), month(getdate())-3, 1)
and 
getdate()
group by capj.cnsmr_accnt_id, 
left(datename(Month, cnsmr_accnt_pymnt_pstd_dt), 3) + right(datename(year, cnsmr_accnt_pymnt_pstd_dt), 2), 
 wrkgrp_nm) as Mnth_Tot_Tbl
 pivot 
 (
 sum(Mnth_Tot) 
 for 
 Month_Yr in (' + @Dates + ')) as Piv')

答案 3 :(得分:0)

因此,我们有2个答案。感谢GarethD和Pradip。

总结一下,我测试了Pradip的解决方案如下:

protractor --verbose --browser=chrome --multiCapabilities