动态数据透视 - 如何以参数方式获取列标题?

时间:2011-10-16 13:10:16

标签: tsql

我希望为SAP B1(t-sql)编写一个查询,该查询将按月和按月列出所有收入和费用项目。

我已经使用PIVOT成功编写了一个查询,但我不希望列标题被硬编码为:Jan-11,Feb-11,Mar-11 ... Dec-11。

相反,我希望列标题是参数化生成的,所以如果我输入:

--------------------------------------
Query - Selection Criteria
--------------------------------------

Posting Date      greater or equal        01.09.10

Posting Date      smaller or equal        31.08.11

[OK]   [Cancel]

Query将生成以下列:

9月10日,10月10日,11月10日,..... 8月11日

我猜DYNAMIC PIVOT可以做到这一点。 所以,我修改了从另一个论坛获得的一个SQL以满足我的目的,但它不起作用。我得到的错误消息是Incorrect Syntax near 20100901

有人能帮我找到我的错误吗?

注意:在SAP B1中,'[%1]'是输入变量

这是我的疑问:

/*Section 1*/

DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)

-------------------------------------
/*Section 2*/

SELECT @listCol = 
STUFF(
   ( SELECT DISTINCT '],[' + CONVERT(VARCHAR, MONTH(T0.RefDate), 102)
       FROM JDT1 
        FOR XML PATH(''))
     , 1, 2, '') + ']' 

------------------------------------
/*Section 3*/

SET @query = '
SELECT * FROM 
(
   SELECT 
        T0.Account,
        T1.GroupMask,
        T1.AcctName,
        MONTH(T0.RefDate) as [Month],   
        (T0.Debit - T0.Credit) as [Amount]
    FROM dbo.JDT1 T0
   JOIN dbo.OACT T1 ON T0.Account = T1.AcctCode 
   WHERE
      T1.GroupMask IN (4,5,6,7) AND
      T0.[Refdate] >= '[%1]' AND
      T0.[Refdate] <= '[%2]'
 ) S
PIVOT 
(
    Sum(Amount)
    FOR [Month] IN ('+@listCol+')
) AS pvt
'

--------------------------------------------
/*Section 4*/

EXECUTE (@query)

1 个答案:

答案 0 :(得分:0)

我不了解SAP,但有几件事情会浮现在脑海中:

  • 您希望@listCol在方括号内包含数字集合,例如[07],[08],[09]...。但是,您的代码似乎不会在此字符串的开头添加[

  • 尝试更换行

    T0.[Refdate] >= '[%1]' AND
    T0.[Refdate] <= '[%2]'
    

    T0.[Refdate] >= ''[%1]'' AND
    T0.[Refdate] <= ''[%2]''
    

(当我在编辑你的问题时,我还在这两行中的第一行AND之前添加了一个空格。)