2014-06-18 3 views
1
SELECT 
    TOB.SchoolID, 
    SUM (TOB.Rice)- SUM(TDMD.Rice) 
FROM tblOpeningBalance TOB 
JOIN tblDailyMidDayDetails TDMD 
    ON TOB.SchoolID = TDMD.SchoolID 
WHERE TOB.Date<=CONVERT(datetime,'19/06/2014',103) 
GROUP BY TOB.SchoolID; 

이것은 잘못된 결과를 얻는 쿼리입니다. 을 얻기 위해 시도하는 동안잘못된 결과를 반환하는 뺄셈 연산

SELECT 
    SchoolID, 
    SUM(Rice) AS Rice 
FROM tblDailyMidDayDetails 
WHERE Date<=CONVERT(datetime,'19/06/2014',103) 
GROUP BY SchoolID; 

이 두 쿼리는 실제 결과를 반환하지만 :

SELECT 
    DISTINCT SchoolID, 
    SUM (Rice) AS Rice 
FROM tblOpeningBalance 
WHERE Date <= CONVERT(datetime,'19/06/2014',103) 
GROUP BY SchoolID; 

두 번째 쿼리가 .. 내가 쿼리 것을 개별적으로 빼기하려는 값을 얻으려면 합쳐진 결과를 빼서 잘못된 값을 얻고 있습니다.

나는 오해로 뭔가 잘못하고 있습니다.

나를 안내하십시오!

+0

너무 당신의 결합 된 쿼리에 MidDayMeala 테이블의 컬럼에 대한 날짜 필터를 추가 –

+0

아마도 거기에 같은'SchoolID'에 대해 둘 이상의 행 각 테이블. 각 테이블에 2 행이 있으면 각 조합이 결과로 끝나고 반복되는 값이있는 4 행이 생깁니다. –

답변

2

그냥 서브 쿼리로합니다 (DISTINCT 제외) 기존 쿼리를 계속 :

SELECT ob.SchoolID, 
     ob.Rice - dmdd.Rice 
FROM (
    Select SchoolID, 
    SUM (Rice) AS Rice 
    FROM tblOpeningBalance 
    Where 
    Date<='20140619' 
    GROUP BY SchoolID) ob 
    INNER JOIN 
(
    SELECT SchoolID,SUM(Rice) AS Rice 
    FROM tblDailyMidDayDetails 
    WHERE Date<='20140619' 
GROUP BY SchoolID) dmdd 
    ON 
     ob.SchoolID = dmdd.SchoolID 

이것은 그들이되기 전에 일부 값을 중복 방지하는 조인의 각 측면에 각 SchoolID에 대해 하나의 행을가 있음을 보장합니다 집합.

현재 두 테이블 모두에 동일한 SchoolID에 대한 행이 여러 개 있기 때문에 문제가 있다고 생각합니다. 당신이 얻는 문제는 여기에 설명되어 있습니다. 즉, 표 1은 데이터 밝혔 :

SchoolID Column1  Rice 
1   abc   10 
1   def   20 

및 표 2에 데이터가 :

SchoolID Column2  Rice 
1   ghi   30 
1   jkl   40 

응집체를 계산하면 다음 행 만들 전에 조인 논리합 :

SchoolID Column1  Rice SchoolID  Column2  Rice 
1   abc   10  1   ghi   30 
1   abc   10  1   jkl   40 
1   def   20  1   ghi   30 
1   jkl   20  1   jkl   40 

그리고 결과 집합에 대해 컴퓨팅 집계가 잘못된 결과를 생성하는 이유를 알 수 있습니다.

+0

이것은 작동 중입니다 .Great.thanks :) –

+0

오. 내가 참조. 도와 주셔서 감사합니다. 이제 알겠습니다. –

1

우리는이 usnig CTE 같이 할 수 ..

;WITH CTE AS 
    (Select SchoolID As SchoolID, 
    SUM (Rice) AS Rice 
    FROM tblOpeningBalance 
    Where 
    Date<='20140619' 
    GROUP BY SchoolID) 
,CTE2 AS 
    (SELECT SchoolID As SchoolID,SUM(Rice) AS Rice 
    FROM tblDailyMidDayDetails 
    WHERE Date<='20140619' 
    GROUP BY SchoolID) 

Select C.SchoolID,C.Rice - CC.Rice As RIce 
    FROM CTE C 
INNER JOIN CTE2 CC 
    ON c.SchoolID = Cc.SchoolID 
GROUP BY C.SchoolID 
관련 문제