2011-09-28 65 views
0

我如何在一个分组的查询中使用子查询?SQL:如何在一个分组的查询中使用子查询?

我使用SQL Server 2008 R2和Delphi 2010

我收到此错误:

Cannot perform an aggregate function on an expression 
containing an aggregate or a sub query. 

喜欢这个查询:

select 
    t1.sen, 
    sum(t1.d1)as d1, 
    sum(t1.d2)as d2, 
    sum(t1.d1+t1.d2) as d_sum, 
    Round((sum((1000*(t1.d1+t1.d2))/(9500-(
     select sum(t2.t_shab+t2.t_rooz) 
     from tbl1 t2 
     where FCode=81 AND DCode=1 AND t2.sen<=t1.sen 
    )))),1) as SSS 
from 
    tbl1 t1 
where 
    FCode = 81 
    AND DCode = 1 

组由 t1.sen

+0

您是否确实需要仅在一个SQL请求中执行此操作?我可以建议你使用治疗或视图来简化它。 –

+0

不,,,我不需要在一个查询中完成,,,,但我认为我不能让它超过一个。如果你可以请帮助我。 – Arash

回答

0

它的真实方式

create function getSumBSen2(@pfcode INT, @pdcode INT, @pSen INT) returns int 
as 
begin 
    declare @r int; 
    select 
     @r= sum(t2.t_shab + t2.t_rooz) 
    from 
     tbl1 t2 
    where 
     t2.FCode = @pfcode 
    and t2.DCode = @pdcode 
    and t2.sen <= @pSen; 

    return (@r); 
end; 
GO 

select 
    t1.sen, 
    sum(t1.d1) as d1, 
    sum(t1.d2) as d2, 
    sum(t1.d1 + t1.d2) as d_sum, 
    Round((sum((1000*(t1.d1+t1.d2)+0.01)/(9500-(dbo.getSumBSen2(t1.FCode, t1.DCode, t1.sen))))),1) as SSS 
from 
    tbl1 t1 
where 
    t1.FCode = 81 
and t1.DCode = 1 
group by 
    t1.sen; 
2

没有任何保证,你可以尝试,如果它不工作,让我知道,我会删除我的回答

create function getSumBSen(@pfcode number, @pdcode number, @pSen number) returns number 
as 

begin 
    declare @r number; 
    select 
     @r =sum(t2.t_shab + t2.t_rooz) 
    from 
     tbl1 t2 
    where 
     t2.FCode = @pfcode 
    and t2.DCode = @pdcode 
    and t2.sen <= @pSen 
    group by t2.FCode, t2.DCode; 

    return (@r); 
end; 


select 
    t1.sen, 
    sum(t1.d1) as d1, 
    sum(t1.d2) as d2, 
    sum(t1.d1 + t1.d2) as d_sum, 
    Round((sum((1000*(t1.d1+t1.d2))/(9500-getSumBSen(t1.FCode, t1.dcode, t1.sen)))),1) as SSS 
from 
    tbl1 t1 
where 
    t1.FCode = 81 
and t1.DCode = 1 
group by 
    t1.sen; 

留念:

补充说,它不会让我真正修复的代码,因为我编辑过短。所以我不得不写更多的杂项垃圾,以便代码修复将被接受。

+0

您只能选择表格变量。 – HLGEM

+0

我会避免标量函数 - 在这种情况下(如果它最多只有几十万行),它可能会执行三角形连接,但对于非常大的集合,黑色框不会执行。 –

+0

我同意,但关于我的知识的概率和限制,我无法想象任何其他解决方法很容易。它在一个请求中不起作用...我的第一步是找到某些工作... –

1

试试这个:

DECLARE @tbl1 AS TABLE 
    (
    FCode INT 
    ,DCode INT 
    ,sen INT 
    ,d1 INT 
    ,d2 INT 
    ,t_shab INT 
    ,t_rooz INT 
    ) ; 

SELECT * 
FROM (
     SELECT t1.sen 
       ,SUM(t1.d1) AS d1 
       ,SUM(t1.d2) AS d2 
       ,SUM(t1.d1 + t1.d2) AS d_sum 
       ,ROUND((SUM((1000 * (t1.d1 + t1.d2))/(9500 - factor.factor))), 
         1) AS SSS 
     FROM @tbl1 AS t1 
     INNER JOIN (
        SELECT t1.sen 
          ,SUM(t2.t_shab + t2.t_rooz) AS factor 
        FROM @tbl1 AS t2 
        INNER JOIN @tbl1 AS t1 
          ON t1.FCode = 81 
           AND t1.DCode = 1 
           AND t2.FCode = 81 
           AND t2.DCode = 1 
           AND t2.sen <= t1.sen 
        GROUP BY t1.sen 
        ) AS factor 
       ON factor.sen = t1.sen 
     WHERE FCode = 81 
       AND DCode = 1 
     GROUP BY t1.sen 
     ) AS X ; 
0

你应该能够把你的子查询下FROM条款,下面这个一般模式:

SELECT TABLE1.ID, SUM(TABLE1.A), ROUND(SUM(T2.B1), 2) 
FROM TABLE1, (SELECT SUM(B) B1 FROM TABLE2 WHERE ...) T2 
GROUP BY TABLE1.ID 

试图“翻译”您查询,您”我可能会得到类似于这样的东西:

select 
    t1.sen, 
    sum(t1.d1)as d1, 
    sum(t1.d2)as d2, 
    sum(t1.d1+t1.d2) as d_sum, 
    Round((sum((1000*(t1.d1+t1.d2))/(9500-(
     t2a.s 
    )))),1) as SSS 
from 
    tbl1 t1, 
    (
     select sum(t2.t_shab+t2.t_rooz) s 
     from tbl1 t2 
     where FCode=81 AND DCode=1 AND t2.sen<=t1.sen 
    ) t2a 
where 
    FCode = 81 
    AND DCode = 1 
group by 
    t1.sen 
+1

这是musa的第一个提议,但经过他的测试,似乎不起作用,t1是他未知的GIN子系统查询。我删除了所有关于它的评论,因为它不工作......如果你确定让我知道...... –

+0

我认为你需要做一个类似的三角形连接,因为我得到:Msg 4104,Level 16,State 1,第25行 无法绑定多部分标识符“t1.sen”。 –

+0

这只是一个普遍的想法。如果不知道OP没有告诉我们的实际数据模型,我无法真正测试查询。 –