2013-03-21 58 views
0

我的查詢下面是它返回的最後一個記錄上的數量的兩倍。我有3張桌子 - 活動,預訂和預訂。查詢需要列出活動和附加信息,並通過每個活動從預訂表中抽取預訂位置的總數(使用SUM),然後它需要計算相同的tempbook(tempPlacesReserved),以提供該表格內的保留字段是未來的。SQL SUM函數應該使用多個表的數量翻倍

但是,第一個問題是,如果tempbook中的活動沒有記錄,它根本不會返回任何該活動的記錄,爲了解決這個問題,我在過去創建了虛擬記錄,以便它仍然返回記錄,但如果我能做到這一點,我不必這樣做,我寧願它!

我遇到的主要問題是,在返回結果的最終記錄中,它將預訂總數和保留的位置加倍,這使得整個查詢無用。

我知道我做錯了,我只是無法對它進行排序,我在網上搜索了類似的問題,但無法正確地將它們應用於我的情況。

任何幫助,將不勝感激。

P.S.我知道,通常你不需要完全標記數據庫,表格和字段的所有路徑,但對於我計劃使用它的程序,我必須這樣做。

代碼:

SELECT [LeisureActivities].[dbo].[activities].[activityID], 
    [LeisureActivities].[dbo].[activities].[activityName], 
    [LeisureActivities].[dbo].[activities].[activityDate], 
    [LeisureActivities].[dbo].[activities].[activityPlaces], 
    [LeisureActivities].[dbo].[activities].[activityPrice], 
    SUM([LeisureActivities].[dbo].[bookings].[bookingPlaces]) AS 'bookingTotal', 
    SUM (CASE WHEN[LeisureActivities].[dbo].[tempbookings].[tempReserveDate] > GetDate() THEN [LeisureActivities].[dbo].[tempbookings].[tempPlaces] ELSE 0 end) AS 'tempPlacesReserved' 
FROM [LeisureActivities].[dbo].[activities], 
    [LeisureActivities].[dbo].[bookings], 
    [LeisureActivities].[dbo].[tempbookings] 
WHERE ([LeisureActivities].[dbo].[activities].[activityID]=[LeisureActivities].[dbo].[bookings].[activityID] 
    AND [LeisureActivities].[dbo].[activities].[activityID]=[LeisureActivities].[dbo].[tempbookings].[tempActivityID]) 
    AND [LeisureActivities].[dbo].[activities].[activityDate] > GetDate() 
GROUP BY [LeisureActivities].[dbo].[activities].[activityID], 
    [LeisureActivities].[dbo].[activities].[activityName], 
    [LeisureActivities].[dbo].[activities].[activityDate], 
    [LeisureActivities].[dbo].[activities].[activityPlaces], 
    [LeisureActivities].[dbo].[activities].[activityPrice]; 
+0

TY bluefeet你太快,我 – user2195482 2013-03-21 17:46:36

回答

0

所以如果tempBookings表中沒有記錄,你將不會返回任何您當前的查詢使用每個表之間的INNER JOIN

我會建議您開始使用JOIN語法。您可能還需要使用子查詢來獲取總計。

SELECT a.[activityID], 
    a.[activityName], 
    a.[activityDate], 
    a.[activityPlaces], 
    a.[activityPrice], 
    coalesce(b.bookingTotal, 0) bookingTotal, 
    coalesce(t.tempPlacesReserved, 0) tempPlacesReserved 
FROM [LeisureActivities].[dbo].[activities] a 
LEFT JOIN 
(
    select activityID, 
    SUM([bookingPlaces]) AS bookingTotal 
    from [LeisureActivities].[dbo].[bookings] 
    group by activityID 
) b 
    ON a.[activityID]=b.[activityID] 
LEFT JOIN 
(
    select tempActivityID, 
    SUM(CASE WHEN [tempReserveDate] > GetDate() THEN [tempPlaces] ELSE 0 end) AS tempPlacesReserved 
    from [LeisureActivities].[dbo].[tempbookings] 
    group by tempActivityID 
) t 
    ON a.[activityID]=t.[tempActivityID] 
WHERE a.[activityDate] > GetDate(); 

注:我使用的別名,因爲它更容易閱讀

+0

這工作一種享受 - 有一個失蹤(在接近底部的ON功能,但給你寫這個沒有日期等你面前我印象深刻!謝謝! – user2195482 2013-03-22 11:35:09

+0

@ user2195482感謝您的提示'('是固定的,我很高興這工作爲你! :) – Taryn 2013-03-22 11:36:29

0

使用新的SQL-92加入語法,並加入到tempBookings外連接。還用表別名清理你的sql。使閱讀更容易。至於爲什麼最後一行的數值翻了一番,我不知道,但有可能是因爲你輸入的額外虛擬記錄造成的。擺脫他們。該問題已通過對tempBookings使用外連接來解決。另一種可能性是,你必須對tempBookings表(t.tempActivityID = a.activityID)的連接條件不足以保證它將僅與活動表中的一條記錄匹配......例如,如果它匹配兩個在活動的記錄,然後從Tempbookings行會在輸出重複兩次,(使之加倍)

SELECT a.activityID, a.activityName, a.activityDate, 
     a.activityPlaces, a.activityPrice, 
     SUM(b.bookingPlaces) bookingTotal, 
     SUM (CASE WHEN t.tempReserveDate > GetDate() 
       THEN t.tempPlaces ELSE 0 end) tempPlacesReserved 
FROM LeisureActivities.dbo.activities a 
    Join LeisureActivities.dbo.bookings b 
     On b.activityID = a.activityID 
    Left Join LeisureActivities.dbo.tempbookings t 
     On t.tempActivityID = a.activityID 
WHERE a.activityDate > GetDate() 
GROUP BY a.activityID, a.activityName, 
    a.activityDate, a.activityPlaces, 
    a.activityPrice;