2009-11-02 18 views
5

Ho una tabella "Eventi" e una tabella "Slot" in cui Slots.SlotID = Events.MainSlot OR Events.ExtraSlot.Due query SUM insieme

ho bisogno di sommare il numero di “partecipanti” per fascia oraria (come MainSlot e come ExtraSlot - ExtraSlot è opzionale)

tabella "Eventi"

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 

Tabella "slot"

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

Se io interrogare il database separatamente come segue:

  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 

... o:

  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 

ottengo il seguente rispettivamente:

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

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

Entrambi i risultati sono corretti.

Tuttavia, se ho messo le due interrogazioni insieme qualcosa non va come mostra la tabella seguente

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 

Che cosa sto facendo di sbagliato? Grazie per l'aiuto!

+0

Che database stai usando? –

+0

Perché non limitarsi a fare due subselect, sommando questi risultati insieme. –

+0

Ciao, sto usando SQLServer. James, come faccio? –

risposta

0

La mia ipotesi è che sia qualcosa legato al fatto che si dispone di record in entrambi per quel gruppo. Provate il seguente (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

Grazie per tutti i commenti. Controllerò il mio codice e lo postò non appena trovo la soluzione migliore. Grazie molto!!! –

+0

@Quassnoi - Bello. –

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

ci si sta unendo due volte, in modo da ottenere un duplicato risultati nel vostro ritorno. Fondamentalmente si sta ottenendo questo:

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

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

Questo è il comportamento previsto perché stai unendo X a ogni riga risultante da Slot JOIN E.