2016-10-31 1 views
0

Peut s'il vous plaît quelqu'un m'aider à trier cette erreur. J'ai une requête de somme de somme, en exécutant la requête j'ai une erreur montrée ci-dessous.
Sum (Sum()) dans SQL

select distinct 
    t1.whscode, 
    'Invoice', 
    count(distinct t1.DocEntry), 
    sum(
     case when t0.DiscPrcnt>0 and t0.DpmAmnt>0 then 
      (sum(t1.LineTotal)-t0.DiscPrcnt)-t0.DpmAmnt 
     else 
      (sum(t1.LineTotal)-t0.DpmAmnt) 
     end 
    ) 
from 
    oinv t0 (NOLOCK) 
    inner join inv1 t1 (NOLOCK) 
     on t0.docentry=t1.docentry 
where 
    t0.DocDate between '10-25-16' and '10-25-16' 
    and t1.whscode='tamst' 
group by 
    t1.whscode 

erreur:

Impossible d'effectuer une fonction d'agrégation sur une expression contenant un agrégat ou une sous-requête.

+7

Si vous prenez un pas en arrière « SQL Server refuse d'exécuter ma requête » à « Ce que je veux accomplir », pourriez-vous expliquer le raisonnement derrière ça? Il n'y aura jamais qu'un seul groupe en jeu d'un point de vue agrégé que SUM regarde alors "SUM (SUM (...) n'a vraiment aucun sens. Peut-être que tout ce que vous voulez faire est de supprimer le SUM (...) de l'intérieur l'expression de cas? –

+2

Notez que le 'distinct 'n'est pas nécessaire lorsque vous groupez déjà des enregistrements – Bouke

+1

Un peu hors sujet, mais vous devriez lire cet article avant de continuer à joncher vos questions avec des conseils NOLOCK.Il est beaucoup plus sinistre que la plupart des gens réalisent. //blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

Répondre

0

Vous pouvez utiliser OVER comme ci-dessous:

SELECT 
    A.whscode, 
    'Invoice', 
    COUNT(distinct A.DocEntry), 
    SUM(case when A.DiscPrcnt > 0 and A.DpmAmnt > 0 then (A.LineTotal - A.DiscPrcnt)-A.DpmAmnt else (A.LineTotal-A.DpmAmnt) end) 
FROM 
(
    SELECT 
     t1.whscode, 
     t1.DocEntry, 
     t0.DiscPrcnt, 
     t0.DpmAmnt, 
     sum(t1.LineTotal) OVER (PARTITION BY t1.whscode) LineTotal 
    from oinv t0 (NOLOCK) inner join inv1 t1 (NOLOCK) on t0.docentry=t1.docentry 
    where t0.DocDate between '10-25-16' and '10-25-16' and t1.whscode='tamst' 
) A 
GROUP BY 
    A.whscode