2014-04-22 2 views
-2
declare @s int; 
declare @dt date; 
declare @p int; 
declare @r int; 
declare @t int; 
declare @rr int; 
declare @day int; 

set @s = 7; set @p = 14; set @r = 21; set @t = 28; 
set @dt = (SELECT DATEADD(month, -1, '2014-02-11')) 
set @day = (select DAY('2014-02-11')) 

SELECT 
    SUM(SUM(((DCC.TOTAL * 35)/100))/ROUND((((SUM(dcc.EMI)/100) + 
     (SUM(dcc.[RepoArrear])/100))/((dcc.TOTAL * 35)/100)) * 100, 0)) 
FROM 
    [DCRA].[dbo].[DCC] 
INNER JOIN 
    [DCRA].[dbo].[FEB14_DCR] ON dcc.REGION = FEB14_DCR.REGION 
WHERE 
    dcc.CIRCLE = 'C1' 
    AND (dcc.CURR_DATE BETWEEN '2014-02-01' AND '2014-02-11') 
    AND feb14_DCR.CURR_DATE = @dt 
    AND FEB14_DCR.[CIRCLE] = 'C1' 
GROUP BY 
    DCC.TOTAL, DCC.CIRCLE, FEB14_DCR.[RESO] 
ORDER BY 
    DCC.CIRCLE 

이것은 내 쿼리입니다. 나는이 논리의 합을 원한다. 하지만 대신 오류가 발생합니다 :집계 함수 또는 하위 쿼리의 합계

메시지 130, 수준 15, 상태 1, 줄 3
집계 또는 하위 쿼리가 포함 된 식에서는 집계 함수를 수행 할 수 없습니다.

+1

코드 형식을 지정하십시오. –

+0

코드에 4 개의 SUM 문이 있습니다. 계속 합산이 많이 있습니다. 당신이 원하는 것을 좀 더 구체적으로 표현할 수 있습니까? – sarin

+0

난 수정 테이블 값 및 일부 다른 출력 점점에서 일부 값을 계산 중입니다. – user2866575

답변

0

좋은 분위기의 IM이므로 코드를 형식화했습니다.

당신이 가진 문제는 첫 번째 라인은 SUM을 (SUM (()는 하위 쿼리에서 먼저 내부 aggrgate을 그룹화하지 않고 할 수없는있다.

SO이의 잘 형식의 SQL이다 가지고있다 실패한 쿼리.

BEGIN 
DECLARE @s int; 
DECLARE @dt date; 
DECLARE @p int; 
DECLARE @r int; 
DECLARE @t int; 
DECLARE @rr int; 
DECLARE @day int; 

SET @s=7; SET @p=14; SET @r=21; SET @t=28; 

SET @dt=(SELECT DATEADD(month, -1, '2014-02-11')) 

SET @day=(select DAY('2014-02-11')) 


SELECT 
SUM(SUM(((DCC.TOTAL*35)/100)) **------------------- YOU CANT SUM an Aggregate that hasnt** been grouped yet 
    /ROUND((((SUM(dcc.EMI)/100) 
    + (SUM(dcc.[Repo Arrear])/100)) 
    /((dcc.TOTAL*35)/100))*100,0)) 
FROM [DCRA].[dbo].[DCC] 
     INNER JOIN 
       [DCRA].[dbo].[FEB14_DCR] 
        ON dcc.REGION = FEB14_DCR.REGION 
WHERE dcc.CIRCLE = 'C1' 
    AND 
      (dcc.CURR_DATE BETWEEN '2014-02-01' AND '2014-02-11') 
    AND 
      feb14_DCR.CURR_DATE= @dt 
    AND 
      FEB14_DCR.[CIRCLE]= 'C1' 
GROUP BY 
      DCC.TOTAL 
      ,DCC.CIRCLE 
      ,FEB14_DCR.[RESO] 
ORDER BY 
      DCC.CIRCLE 

END 

를 해결하는 방법은 먼저 SUM ((DCC.TOTAL * 35)/100)하고 다시 집계하는 것입니다. 바이 집계

BEGIN 
    DECLARE @s int; 
    DECLARE @dt date; 
    DECLARE @p int; 
    DECLARE @r int; 
    DECLARE @t int; 
    DECLARE @rr int; 
    DECLARE @day int; 

    SET @s=7; SET @p=14; SET @r=21; SET @t=28; 

    SET @dt=(SELECT DATEADD(month, -1, '2014-02-11')) 

    SET @day=(select DAY('2014-02-11')) 

SELECT SUM(DCCTOTALVAL/NULLIF(DCCEMI,0)) 
FROM ( 
SELECT 
      DCCTOTAL = SUM((DCC.TOTAL*35)/100), 
      DCCEMI = ROUND(SUM(dcc.EMI)/100 + SUM(dcc.[Repo Arrear])/100)/((DCC.TOTAL*35)/100) * 100,1) 
    FROM [DCRA].[dbo].[DCC] 
      INNER JOIN 
        [DCRA].[dbo].[FEB14_DCR] 
         ON dcc.REGION = FEB14_DCR.REGION 
    WHERE dcc.CIRCLE = 'C1' 
     AND 
       (dcc.CURR_DATE BETWEEN '2014-02-01' AND '2014-02-11') 
     AND 
       feb14_DCR.CURR_DATE= @dt 
     AND 
       FEB14_DCR.[CIRCLE]= 'C1' 
    GROUP BY 
       DCC.TOTAL 
       ,DCC.CIRCLE 
       ,FEB14_DCR.[RESO] 
    )tab 

    END 
+0

솔직히 말하면 처음부터 코드를 포맷했다면 중복 SUM()이 더 쉽게 보일 수 있습니다 .. –

+0

여전히 메시지 130, 레벨 15, 상태 1, 라인 오류가 발생합니다. 20 집계 또는 하위 쿼리가 포함 된 식에서 집계 함수를 수행 할 수 없습니다. – user2866575

+0

거기에 다른 SUM에 몇 가지 문제가 있으므로 선택 항목을 편집했습니다. –

0

당신을 그룹과 그런 다음 다시 집계하십시오. 이것은 일부 dbms (Oracle의 경우)에서 가능하지만 SQL Server에서는 가능하지 않습니다. 문제가 단순히 집계 한 개 문을 둘러싸고, 즉 대신

select sum(avg(somevalue)) from sometable group by someothervalue 

당신의 예에서

select sum(x) 
from 
(
    select avg(somevalue)) as x from sometable group by someothervalue 
) 

을 회피하기 위해 (좀 괄호를 제거했다. 내가 수행하여 실수를하지 않았다 희망 그래서) :

select sum(x) 
from 
(
    SELECT 
    sum(dcc.TOTAL * 35/100) 
    /
    round(sum(coalesce(dcc.EMI,0) + coalesce(dcc.[Repo   Arrear],0))/(dcc.TOTAL * 35/100), 0) as x 
    from [DCRA].[dbo].[DCC] 
    inner join [DCRA].[dbo].[FEB14_DCR] on dcc.REGION=FEB14_DCR.REGION 
    Where dcc.CIRCLE='C1' 
    and dcc.CURR_DATE BETWEEN '2014-02-01' and '2014-02-11' 
    and [email protected] and FEB14_DCR.[CIRCLE]='C1' 
    GROUP BY DCC.TOTAL ,DCC.CIRCLE,FEB14_DCR.[RESO] 
); 

BTW : 주문 절을 삭제했습니다. 최종 집계에없는 항목으로 주문할 수 없습니다.