2009-11-02 35 views
5

Tôi có bảng "Sự kiện" và một bảng "Slots" trong đó Slots.SlotID = Events.MainSlot HOẶC Events.ExtraSlot.Hai truy vấn SUM cùng nhau

tôi cần phải tổng hợp số lượng “tham dự” cho mỗi khe thời gian (như MainSlot và như ExtraSlot - ExtraSlot là không bắt buộc)

Bảng "Sự kiện"

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 

Bảng "Slots"

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

Nếu tôi truy vấn cơ sở dữ liệu riêng biệt như sau:

  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 

... hoặc:

  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 

tôi nhận được những điều sau đây, tương ứng:

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

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

Cả hai kết quả là chính xác.

Tuy nhiên nếu tôi đặt hai truy vấn cùng cái gì là sai khi thấy bảng dưới đây

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 

Tôi đang làm gì sai? Cảm ơn bạn đã giúp đỡ!

+0

Bạn đang sử dụng cơ sở dữ liệu nào? –

+0

Tại sao không chỉ thực hiện hai lựa chọn, tổng hợp các kết quả đó lại với nhau. –

+0

Xin chào, tôi đang sử dụng SQLServer. James, Làm thế nào để tôi làm điều đó? –

Trả lời

0

Tôi đoán rằng đó là điều gì đó liên quan đến thực tế là bạn có hồ sơ trong cả hai cho nhóm đó. Hãy thử như sau (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

Cảm ơn tất cả các nhận xét. Tôi sẽ kiểm tra mã của tôi và đăng lại ngay sau khi tôi tìm ra giải pháp tốt nhất. Cảm ơn nhiều!!! –

+0

@Quassnoi - Rất tuyệt. –

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

Bạn đang tham gia hai lần, vì vậy bạn sẽ có được một kết quả trùng lặp lại của bạn. Về cơ bản bạn nhận được điều này:

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

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

Đây là hành vi mong đợi vì bạn đang tham gia X vào mỗi hàng kết quả từ Slots JOIN E.

Các vấn đề liên quan