2009-11-02 13 views
5

Mam tabelę "Zdarzenia" i tabelę "Gniazda", gdzie Slots.SlotID = Events.MainSlot OR Events.ExtraSlot.Dwa zapytania SUM razem

potrzebne do sumy liczby „Uczestników” dla każdego przedziału czasowego (w MainSlot, jak ExtraSlot - ExtraSlot opcjonalnie)

Tabela "wydarzeń"

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 

Tabela "gniazdo"

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

Gdybym zapytania do bazy oddzielnie w następujący sposób:

  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 

... albo:

  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 

otrzymuję następujący odpowiednio:

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

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

Oba wyniki są prawidłowe.

Jednak jeśli kładę dwa zapytania razem coś jest nie tak, jak pokazuje tabela poniżej

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 

Co robię źle? Dzięki za pomoc!

+0

Jakiej bazy danych używasz? –

+0

Dlaczego po prostu nie zrobić dwóch podselekcji, sumując te wyniki razem. –

+0

Witam, używam SQLServer. James, Jak to zrobić? –

Odpowiedz

0

Przypuszczam, że jest to coś związanego z faktem, że masz zapisy w obu dla tej grupy. Spróbuj wykonać następujące czynności (MSSQL Server)

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

Dzięki za wszystkie komentarze. Sprawdzę mój kod i odeślemy go, gdy tylko znajdę najlepsze rozwiązanie. Wielkie dzięki!!! –

+0

@Quassnoi - Nice. –

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

Ty łączącą dwa razy, więc masz zduplikowane wyniki w zamian. Zasadniczo dostajesz to:

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

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

To jest oczekiwane zachowanie, ponieważ łączysz X z każdym wypadkowym wierszem z gniazd JOIN E.