2009-11-02 21 views
5

Tengo una tabla "Eventos" y una mesa de “slots”, donde Slots.SlotID = O Events.MainSlot Events.ExtraSlot.dos consultas de SUMA junto

que necesita sumar el número de “asistentes” por ranura de tiempo (como MainSlot y como ExtraSlot - ExtraSlot es opcional)

Tabla "Eventos"

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 

Tabla "slots"

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

Si consultar la base de forma separada de la siguiente manera:

  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 

me sale el siguiente, respectivamente:

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

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

Ambos resultados son correctos.

Sin embargo si pongo las dos consultas juntos algo está mal como muestra la siguiente tabla

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 

¿Qué estoy haciendo mal? ¡Gracias por tu ayuda!

+0

¿Qué base de datos estás usando? –

+0

¿Por qué no hacer dos subselecciones, sumar esos resultados? –

+0

Hola, estoy usando SQLServer. James, ¿cómo hago eso? –

Respuesta

0

Mi conjetura es que es algo relacionado con el hecho de que usted tiene los registros en tanto para ese grupo. Pruebe lo siguiente (Servidor 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

Gracias por todos los comentarios. Revisaré mi código y volveré a publicar tan pronto como encuentre la mejor solución. ¡¡¡Muchas gracias!!! –

+0

@Quassnoi - Agradable. –

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

se está uniendo dos veces, para que pueda obtener un resultado duplicadas en su declaración. Básicamente, está obteniendo esto:

slotid ...... e.mainslot ...... x.extraslot ....... x.actendentes ..... e.absidentes

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

Este es el comportamiento esperado porque se está uniendo a X para cada fila resultante de las ranuras ÚNETE E.

Cuestiones relacionadas