聚合函数或子查询的总和

时间:2014-04-22 08:50:31

标签: sql-server tsql

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 

这是我的查询。我想要这个逻辑的总和。但我得到了一个错误:

  

Msg 130,Level 15,State 1,Line 3
  无法对包含聚合或子查询的表达式执行聚合函数。

2 个答案:

答案 0 :(得分:0)

IM心情很好,所以我已经为你格式化了代码。

你遇到的问题是你的第一行有一个SUM(SUM((),如果没有在子查询中首先对内部aggrgate进行分组,你就无法做到。

这是您查询失败的格式良好的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

答案 1 :(得分:0)

您按组聚合,然后再次聚合。这在某些dbms(例如Oracle)中是可行的,但我不确定在SQL Server中是否可行。为了避免这个问题,只需用汇总语句包围你的陈述,即代替

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

DO

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 feb14_DCR.CURR_DATE=@dt and FEB14_DCR.[CIRCLE]='C1'
  GROUP BY DCC.TOTAL ,DCC.CIRCLE,FEB14_DCR.[RESO]
);

BTW:我删除了你的订单条款。您不能通过最终聚合中没有的东西订购。

相关问题