2014-04-30 3 views
1

Je suis en train d'utiliser les lignes entre ... méthode précédente sans bornes selon how to get cumulative sumSQL cumulatif Erreur totale Server 2012

Je courais MS Server 2012.

La requête utilise une table créée dans un CTE [tbl2]:

SELECT [RowID] 
     , [GroupID] 
     , [NumericalData] 
     , Sum([NumericalData]) 
     Over (Partition By [GroupID] 
     order by [RowID] 
     ROWS between UNBOUNDED PRECEDING and CURRENT ROW) as Cumulative 

    FROM TBL2 
    GROUP BY [ROWid] 
    , [groupID] 
    , [NumericalData] 
    Order By ROW 

je reçois le message d'erreur suivant: Msg 102, niveau 15, état 1, ligne 103 syntaxe incorrecte près de 'rows'.

Quelqu'un sait-il ce que je fais mal?

Merci à l'avance

+0

On dirait que cela devrait fonctionner pour vous, sauf pour le dernier groupe de/commande par. Le groupe est-il vraiment nécessaire? Avez-vous une colonne nommée 'ROW'? –

+1

Il ne semble pas que vous utilisiez SQL Server 2012. Que vous dit 'select @@ version'? –

+0

je reçois Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) \t 28 juin 2012 08:36:30 \t Copyright (c) Microsoft Corporation \t Express Edition (64 bits) sous Windows NT 6.1 (Build 7601: Service Pack 1) – RobTovey

Répondre

1

Cette clause est pas nécessaire pour la somme cumulée dans SQL Server. En outre:

  • Vous mélangez group by avec la fonction de fenêtre. Bien que permis, ce n'est peut-être pas ce que vous voulez vraiment.
  • Votre order by n'est pas valide.

Peut-être est ce que vous voulez:

SELECT [RowID], [GroupID], [NumericalData], 
     Sum([NumericalData]) Over (Partition By [GroupID] order by [RowID]) as Cumulative 
FROM TBL2 
ORDER BY [RowID]; 

EDIT:

Je veux noter que la requête initiale (avec la clause order by fixe) fonctionne dans SQL Fiddle. Peut-être que le problème est la version de SQL Server.

+1

Si vous omettez la clause 'rows', vous utilisez la valeur par défaut, c'est' range'. Si 'RowID' n'est pas unique par' GroupID', vous obtiendrez un résultat différent. Sauf si vous voulez vraiment le résultat produit par 'range', vous devriez utiliser' rows' pour des raisons de performances. –

+0

@MikaelEriksson. . . Je soupçonne que la requête n'est pas vraiment ce que le PO veut. L'agrégation par la valeur numérique, puis son inclusion dans une somme cumulative ne serait pas une opération commune. –

+0

D'accord que la dernière clause group by n'est pas ce qu'il veut et probablement pas l'ordre par l'un ou l'autre, du moins pas comme ça. Je voulais juste faire remarquer que "Cette clause n'est pas nécessaire pour la somme cumulée dans SQL Server." n'est pas entièrement correct. Cela peut avoir un impact sur le résultat et cela aura un impact sur les performances. –