Database SQL Server中来自同一子查询的多个聚合

Database SQL Server中来自同一子查询的多个聚合,database,sql-server-2008,join,subquery,Database,Sql Server 2008,Join,Subquery,有没有更好的方法来做到这一点,而不需要重复的子查询来选择不同的字段 SELECT Name, er.DateEventStarts, e.LocationName, (SELECT count(*) FROM Ticket t WHERE t.Deleted = 0 AND Refunded = 0 AND t.EventRepetitionID = er.EventRepetitionID) AS NoOfAttendees, (SELECT sum(t.TicketTotalCost) FR

有没有更好的方法来做到这一点,而不需要重复的子查询来选择不同的字段

SELECT Name, er.DateEventStarts, e.LocationName,
(SELECT count(*) FROM Ticket t WHERE t.Deleted = 0 AND Refunded = 0 AND t.EventRepetitionID = er.EventRepetitionID) AS NoOfAttendees,
(SELECT sum(t.TicketTotalCost) FROM Ticket t WHERE t.Deleted = 0 AND Refunded = 0 AND t.EventRepetitionID = er.EventRepetitionID) AS NoOfAttendees,
(SELECT sum(t.OnlinePayFee) FROM Ticket t WHERE t.Deleted = 0 AND Refunded = 0 AND t.EventRepetitionID = er.EventRepetitionID) AS OnlinePayFee,
(SELECT sum(t.OnlinePayTotalCost) FROM Ticket t WHERE t.Deleted = 0 AND Refunded = 0 AND t.EventRepetitionID = er.EventRepetitionID) AS OnlinePayTotalCost  
FROM [Event] e
JOIN EventRepetition er ON er.EventRepetitionID = (SELECT TOP 1 EventRepetitionID FROM         EventRepetition er2 WHERE er2.EventID = e.EventID)
正如您所看到的,子查询几乎相同,但只是对不同的行求和或计数。我觉得一定有更好的方法来做这件事,但看不出还有其他方法可以做。我想这可能不是很有效


如果已经回答了这个问题,我深表歉意,但我想不出一种方法来描述这个问题,因此无法搜索解决方案。

下一个问题没有测试,但会是这样的:

select Q.name, Q.ateEventStarts, Q.locationName,
        count(*), sum(T.TicketTotalCost), sum(T.TicketTotalCost), 
        sum(T.OnlinePayFee), sum(T.OnlinePayTotalCost)
    from ( 
        select Name, er.DateEventStarts, e.LocationName, er.EventRepetitionID
            from Event e JOIN EventRepetition er on er.EventRepetitionID = 
                (select top 1 EventRepetitionID from         
                    EventRepetition er2 where er2.EventID = e.EventID) ) Q
    left outer join Ticket T
        on t.Deleted = 0 and T.Refunded = 0 
            and t.EventRepetitionID = Q.EventRepetitionID

这可能会起作用:

SELECT
    Name,
    er.DateEventStarts,
    e.LocationName,
t.NoOfAttendees,
t.TotalTickets,
t.OnlinePayFee,
t.OnlinePayTotalCost  
FROM [Event] e
JOIN EventRepetition er
    ON
        er.EventRepetitionID = (SELECT TOP 1 EventRepetitionID FROM EventRepetition er2 WHERE er2.EventID = e.EventID)
join
    (select EventRepetitionID,COUNT(*),SUM(TicketTotalCost),SUM(OnlinePayFee),SUM(OnlinePayTotalCost)
    from Ticket
    where Deleted = 0 and Refunded = 0
    group by EventRepetitionID) t (EventRepetitionID,NoOfAttendees,TotalTickets,OnlinePayFee,OnlinePayTotalCost)
        on
            er.EventRepetitionID = t.EventRepetitionID

这应该只扫描ticket表一次。

Yes如果将Q.name、Q.DateEventStarts和location name包装为Max(),则该操作有效。我希望有一种方法可以在查询中以某种方式选择一个表,然后对其进行聚合,但我猜SQL server不是这样工作的。我不明白为什么您在进入Q时添加了一个额外的子查询。这只是为了使它更整洁吗?子查询用于join with Ticket为Q中的每一行返回多于1行的情况。如果它返回多于1行(例如n),如果不使用子查询Q,计数和求和将返回n倍的值。啊,是的,原因:)现在看起来很明显,但当时我想不出任何东西。谢谢,这是一个完美的解决方案。