2011-09-28 2 views
0

섹션별로 그룹화 된 쿼리에서 하위 쿼리를 어떻게 사용할 수 있습니까?SQL : 섹션별로 그룹화 된 쿼리에서 하위 쿼리를 어떻게 사용할 수 있습니까?

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

의 :이 쿼리처럼

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

:

나는 SQL 서버 2008 R2와 델파이 2010

나는이 오류가 사용 보증이 없으면 시도해 볼 수 있습니다. 작동하지 않는 경우 알려 주시면

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; 

유품 답변 :

추가, 내 편집이 너무 짧기 때문에 내가 실제로 코드를 수정하지 않습니다. 그래서 코드 픽스 (code fix)를 받아 들일 수 있도록 잡다한 잡동사니를 써야했다.

+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

그것은 첫 번째 제안 이었지만 그의 테스트 후에는 알 수없는 GIN 서브 시스템 쿼리와 같이 작동하지 않습니다. 나는 그것이 작동하지 않기 때문에 그것에 관한 모든 주석을 제거 ... 만약 당신이 확실히 알게되면 .... –

+0

나는 내가 한 것처럼 비슷한 삼각형 결합을해야한다고 생각한다 : 메시지 4104, 레벨 16, 상태 1, Line 25 다중 부분 식별자 "t1.sen"을 바인딩 할 수 없습니다. –

+0

이것은 일반적인 아이디어 일뿐입니다. OP가 우리에게 말하지 않은 실제 데이터 모델을 모른 채 쿼리를 테스트 할 수는 없습니다. –

관련 문제