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
无法对包含聚合或子查询的表达式执行聚合函数。
答案 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:我删除了你的订单条款。您不能通过最终聚合中没有的东西订购。