2011-09-02 5 views
0

다른 필드를 선택하는 반복 된 하위 쿼리없이이 작업을 수행하는 더 좋은 방법이 있습니까?SQL Server에서 동일한 하위 쿼리의 여러 집계

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) 

당신은 하위 쿼리가 거의 동일하지만 단지 요약하거나 다른 행을 계산 볼 수 있듯이. 나는이 일을하는 더 좋은 방법이 있어야한다고 느낍니다.하지만 그 일을하는 방법을 알 수는 없습니다. 나는 이것이 아마도 매우 효율적이지 않을 것이라고 생각한다.

내가 이미 사과했지만이 문제를 설명 할 수있는 방법을 생각할 수 없어 사과 할 수 없으므로 해결책을 찾지 못했습니다.

답변

1

:

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 

이 한 번만 티켓 테이블을 스캔해야합니다.

+0

아 네 원인 : 지금은 분명해 보이지만 그 당시에는 아무 것도 생각할 수 없었습니다. 고맙습니다. 완벽한 솔루션입니다. –

0

다음 하나를 테스트하지,하지만이 같은 것입니다 : 이것은 트릭을 할 수

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 
+0

예, Qname, Q.DateEventStarts 및 위치 이름을 Max()로 랩핑 한 경우 작동합니다. 어떻게 든 쿼리 내에서 테이블을 선택하고 집계를 수행하는 방법이 있었으면 좋겠지 만 SQL 서버 작동 방식이 아닌 것 같습니다. Q로 들어가기는하지만 왜 여분의 하위 쿼리를 추가했는지 이해할 수 없습니다. –

+0

서브 쿼리는 Ticket의 조인이 Q의 각 행에 대해 둘 이상의 행을 반환하는 경우가 있습니다. 행이 둘 이상 (예 : n)을 반환하면 개수 및 합계가이 값을 n 배 반환합니다 하위 쿼리없이. – boes

관련 문제