2013-03-21 19 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;