2011-10-16 1 views
0

Je souhaite écrire une requête pour SAP B1 (t-sql) qui répertoriera tous les éléments de revenu et de dépenses par total et mois par mois.Dynamic pivot - comment obtenir des titres de colonne de façon paramétrique?

J'ai réussi à écrire une requête en utilisant PIVOT, mais je ne veux pas que les en-têtes de colonnes soient codés en dur comme: Jan-11, Feb-11, Mar-11 ... Dec-11.

Au contraire, je veux être générés paramétriquement les têtes de colonne, de sorte que si je entrée:

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

Posting Date  greater or equal  01.09.10 

Posting Date  smaller or equal  31.08.11 

[OK] [Cancel] 

la requête générer les colonnes suivantes:

Sep-10, oct-10, Nov- 10, ..... Aug-11

Je suppose que DYNAMIC PIVOT peut faire l'affaire. Donc, j'ai modifié un SQL obtenu à partir d'un autre forum pour répondre à mon objectif, mais cela ne fonctionne pas. Le message d'erreur que je reçois est Incorrect Syntax near 20100901.

Quelqu'un pourrait m'aider à localiser mon erreur?

Note: Dans SAP B1, '[% 1]' est une variable d'entrée

Voilà ma question:

/*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 ('[email protected]+') 
) AS pvt 
' 

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

EXECUTE (@query) 

Répondre

0

Je ne sais pas SAP, mais deux choses viennent à l'esprit :

  • On dirait que vous voulez @listCol pour contenir une collection de numéros entre crochets, par exemple [07],[08],[09].... Cependant, votre code ne semble pas mettre un [ au début de cette chaîne.

  • Essayez de remplacer les lignes

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

    avec

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

(I a également ajouté un espace avant le AND dans la première de ces deux lignes alors que je faisais le montage de votre question.

+0

Salut Luke, Merci pour votre réponse. –

+0

Salut Luke, Merci pour votre réponse. Malheureusement, cela ne résout pas mon problème. Je réalise que la solution va être très difficile. Heureusement, j'ai trouvé cet article utile: http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx Je dois maintenant travailler dur pour adapter ces idées à mon problème. Cordialement Leon Lai –

Questions connexes