문제

I want to calculate the total sales for each individual AudiEvent including events where there were no sales. Sales will be calculated as BasePrice*PriceMultiplier. So grouping will be based on the EventName and should get the total sales.

SELECT  AudiEvent.EventName, 
        AudiEvent.EventDate, 
        AudiEvent.StartTime,
        SUM(Cast(AuditoriumRows.PriceMultiplier*AudiEvent.BasePrice as DECIMAL(4,1))) as "Total Sales"
FROM    AudiEvent
LEFT OUTER JOIN Reserver 
    ON AudiEvent.AuditoriumID=Reserver.AuditoriumID
INNER JOIN AuditoriumRows 
    ON Reserver.AuditoriumID=AuditoriumRows.AuditoriumID
INNER JOIN Auditorium 
    ON Reserver.AuditoriumID=Auditorium.AuditoriumID
GROUP BY AudiEvent.EventName;

OUTPUT-

EventName       EventDate  StartTime Total Sales
Big Bash        29/6/2014  20:00      24480
County Cricket  06/07/2014 11:00       0
IPL             05/05/2014 03:00       0

INPUT-

Auditorium

AudiID  AudiName 
Audi01  London Theatre 
Audi02  Brentwood Hall 
Audi03  County Hall

AudiEvent

EventID AudiID EventName       BasePrice
1    Audi01 Big Bash          300
2    Audi01 County Cricket    400
3    Audi01 Big Bash          300
4    Audi01 Big Bash          300
5    Audi01 County Cricket    300
6    Audi01 Big Bash          300
7    Audi01 Big Bash          310
8    Audi01 County Cricket    400
9    Audi01 County Cricket    400
10   Audi01 County Cricket    400
11   Audi02 County Cricket    500
12   Audi02 County Cricket    520
13   Audi02 County Cricket    500
14   Audi02 County Cricket    500
15   Audi02 County Cricket    500
16   Audi03 IPL               1000
17   Audi03 IPL               1000
18   Audi03 IPL               1000
19   Audi03 Big Bash          350
20   Audi03 Big Bash          350

AuditoriumRows

AudiID   PriceMultiplier SeatRows
Audi01      1.0          8
Audi01      1.5          7
Audi01      2.0          6
Audi01      2.5          5
Audi01      3.0          4
Audi01      3.5          3
Audi01      4.0          2
Audi01      4.5          1
Audi01      5.0          0
Audi02      1.0          8
Audi02      1.5          7
Audi02      2.0          6
Audi02      2.5          5
Audi02      3.0          4
Audi02      3.5          3
Audi02      4.0          2
Audi02      4.5          1
Audi02      5.0          0
Audi03      1.0          8
Audi03      1.5          7
Audi03      2.0          6
Audi03      2.5          5
Audi03      3.0          4
Audi03      3.5          3
Audi03      4.0          2
Audi03      4.5          1
Audi03      5.0          0

Reserver

AudiID EventID SeatNumber
Audi01  1           7
Audi01  3           2
Audi01  4           4
Audi01  5           0
Audi01  6           1
Audi01  7           6
Audi01  8           3
Audi01  10          7
Audi01  2           0
Audi01  3           0
Audi01  5           1
Audi01  7           3
Audi01  1           4
Audi01  1           8
Audi01  1           4
Audi03  19          0
Audi03  20          1
Audi03  19          2
Audi03  20          3        

I am not getting the correct total over here, and neither do I get other 2 events with total sales as 0. I am not sure what is wrong over here.

도움이 되었습니까?

해결책

INNER JOINING on LEFT JOINS will give you unexpected results unless you know what you are doing. I've changed them all to left joins and added a few more fields into the group by statement to make the statement work. Not entirely sure if that will help you!?

This gives you Total Sales for each individual event (i.e. by date and start time).

SELECT AudiEvent.EventName, 
       AudiEvent.EventDate, 
       AudiEvent.StartTime, 
       SUM(Cast(AuditoriumRows.PriceMultiplier*AudiEvent.BasePrice as DECIMAL(4,1))) as "Total Sales" 

FROM AudiEvent 
LEFT JOIN Reserver ON AudiEvent.AuditoriumID=Reserver.AuditoriumID 
LEFT JOIN AuditoriumRows ON Reserver.AuditoriumID=AuditoriumRows.AuditoriumID 
LEFT JOIN Auditorium ON Reserver.AuditoriumID=Auditorium.AuditoriumID 
GROUP BY AudiEvent.EventName, AudiEvent.EventDate, AudiEvent.StartTime;

This gives you Total Sales for each individual event.

SELECT AudiEvent.EventName 
       SUM(Cast(AuditoriumRows.PriceMultiplier*AudiEvent.BasePrice as DECIMAL(4,1))) as "Total Sales" 

FROM AudiEvent 
LEFT JOIN Reserver ON AudiEvent.AuditoriumID=Reserver.AuditoriumID 
LEFT JOIN AuditoriumRows ON Reserver.AuditoriumID=AuditoriumRows.AuditoriumID 
LEFT JOIN Auditorium ON Reserver.AuditoriumID=Auditorium.AuditoriumID 
GROUP BY AudiEvent.EventName;

다른 팁

Try this:

SELECT  AudiEvent.EventName, 
        MAX(AudiEvent.EventDate), 
        MAX(AudiEvent.StartTime),
        COALESCE(SUM(Cast(AuditoriumRows.PriceMultiplier*AudiEvent.BasePrice as DECIMAL(4,1))), 0) as "Total Sales"
        from AudiEvent
        LEFT OUTER JOIN Reserver 
        ON AudiEvent.AuditoriumID=Reserver.AudiID
        AND Reserver.EventID = AudiEvent.EventID
        INNER JOIN AuditoriumRows 
        ON Reserver.AudiID=AuditoriumRows.AudiID
        AND Reserver.SeatNumber=AuditoriumRows.SeatRows
        INNER JOIN Auditorium 
        ON Auditorium.AuditoriumID = AudiEvent.AudiID
        GROUP BY AudiEvent.EventName;

I added extra join conditions (Reserver.EventID = AudiEvent.EventID) and (Reserver.SeatNumber=AuditoriumRows.AudiID).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top