2009-11-02 5 views
5

나는 "Slots.SlotID = Events.MainSlot 또는 Events.ExtraSlot 어디 테이블"이벤트 "및 테이블"Slots "있습니다.두 SUM 쿼리 함께

나는 시간 슬롯 당 "참석자"의 수를 요약합니다 (MainSlot로하고 ExtraSlot로 - ExtraSlot는 선택 사항입니다)

표 "이벤트"

ID------Name----------MainSlot-------ExtraSlot-------Attendees 
1-------Event1--------1 -------------n/a-------------20 
2-------Event2--------1 -------------n/a-------------20 
3-------Event3--------2 -------------n/a-------------40 
4-------Event4--------2 -------------3---------------20 
5-------Event5--------3 -------------4---------------40 
6-------Event6--------3 -------------4---------------20 
7-------Event7--------3 -------------4---------------10 

표 "슬롯"
내가 별도로 데이터베이스를 조회하는 경우

SlotID--- Slot 
1-------- 9.00-9.30 
2-------- 9.30-10 
3-------- 10.30-10.30 
4-------- 10.30-11 

다음과 같이

  SELECT s.Slot, s.SlotID, ISNULL(SUM(e. Attendees), 0) AS Attendees1 
      FROM Slots AS s 
LEFT OUTER JOIN Events AS e ON e.MainSlot = s.SlotID 
     GROUP BY s.Slot, s.SlotID 

... 나 :

  SELECT s.Slot, s.SlotID, ISNULL(SUM(x.Attendees), 0) AS Attendees2 
      FROM Slots AS s 
LEFT OUTER JOIN Events AS x ON x.ExtraSlot = s.SlotID 
     GROUP BY s.Slot, s.SlotID 

나는 각각 다음을 얻을 :

SlotID ------ Attendees1 
1------------- 40 
2------------- 60 
3------------- 70 
4------------- 0 

SlotID ------- Attendees2 
1------------- 0 
2------------- 0 
3------------- 20 *correct 
4------------- 70 

모두 결과가 정확합니다. 내가 뭔가를 두 개의 쿼리를 함께 넣어 경우

그러나 내가 잘못 뭐하는 거지

SELECT s.Slot, s.SlotID, ISNULL(SUM(e.Attendees), 0) AS Attendees1, 
     ISNULL(SUM(x. Attendees), 0) AS Attendees2 
FROM Slots AS s LEFT OUTER JOIN 
Events AS e ON e.MainSlot = s.SlotID LEFT OUTER JOIN 
Events AS x ON x.ExtraSlot = s.SlotID 
GROUP BY s.Slot, s.SlotID 

SlotID------------- Attendees1---------- Attendees2 
1-------------------40-------------------0 
2-------------------60-------------------0 
3-------------------70------------------60 *wrong 
4-------------------0-------------------70 

아래 표와 같이 잘못? 당신의 도움을 주셔서 감사합니다!

+0

어떤 데이터베이스를 사용하고 있습니까? –

+0

왜 두 개의 subselect를 사용하여 결과를 합산하지 않는 것이 좋을까요? –

+0

안녕하세요, 저는 SQLServer를 사용하고 있습니다. James, 어떻게해야합니까? –

답변

0

제 생각에 그것은 그 그룹에 대해 레코드가 있다는 사실과 관련이 있습니다. 당신이 당신의 반환에 중복 결과를 얻을 수 있도록 다음과 같이 해보십시오 (MSSQL 서버)

SELECT s.Slot, s.SlotID, ISNULL(SUM(e.Attendees), 0) AS Attendees1, 
ISNULL(SUM(CASE WHEN x. Attendees IS NULL THEN 0 ELSE x.Attendees END), 0) AS Attendees2 
FROM Slots AS s LEFT OUTER JOIN 
Events AS e ON e.MainSlot = s.SlotID LEFT OUTER JOIN 
Events AS x ON x.ExtraSlot = s.SlotID 
GROUP BY s.Slot, s.SlotID 
3
SELECT s.SlotId, 
     COALESCE(
     (
     SELECT SUM(attendees) 
     FROM events ea 
     WHERE ea.MainSlot = s.SlotId 
     ), 0) AS AttendeesAsMain, 
     COALESCE(
     (
     SELECT SUM(attendees) 
     FROM events ea 
     WHERE ea.ExtraSlot = s.SlotId 
     ), 0) AS AttendeesAsExtra 
FROM Slots s 
+0

모든 댓글 주셔서 감사합니다. 가장 좋은 해결책을 찾자 마자 코드를 확인하고 다시 게시 할 것입니다. 많은 감사합니다 !!! –

+0

@Quassnoi - 니스. –

0
SELECT a.SlotID, Attendees1, Attendees2 FROM 
     (SELECT s.Slot, s.SlotID, ISNULL(SUM(e. Attendees), 0) AS Attendees1 
      FROM Slots AS s 
     LEFT OUTER JOIN Events AS e ON e.MainSlot = s.SlotID 
      GROUP BY s.Slot, s.SlotID) as a, 

     (SELECT s.Slot, s.SlotID, ISNULL(SUM(x.Attendees), 0) AS Attendees2 
      FROM Slots AS s 
     LEFT OUTER JOIN Events AS x ON x.ExtraSlot = s.SlotID 
      GROUP BY s.Slot, s.SlotID) as b 
    WHERE a.SlotID = b.SlotID 
0

당신은 두 번에 합류하고 있습니다. 기본적으로 다음과 같이 표시됩니다.

slotid ...... e.mainslot ...... x.extraslot ....... x.attendees ..... e.attendees

3 ............... 3 ............... 3 ................. 20. ............. 40
3 ........... 3 ............... 3 ..... ............ 20 .............. 20
3 ........... 3 ....... ........ 3 ................. 20 .............. 10

이것은 예상되는 동작은 슬롯 JOIN E.에서 각 결과 행에 X를 연결하기 때문에 예상되는 동작입니다.