2013-02-21 82 views
0

我有這樣的MySQL查詢:合併相關記錄

select day(ReservationDate) as ReservationDay, sum(SleighSeats) as SleighSeats, sum(CabSeats) as CabSeats, 0 as IsFullMoon, '' as OverrideText 
from Reservations 
where month(ReservationDate) = 2 
group by ReservationDate 
union 
select day(CalendarDate) as ReservationDay, 0 as SleighSeats, 0 as CabSeats, IsFullMoon, OverrideText 
from CalendarOverrides 
where month(CalendarDate) = 2 
group by CalendarDate 
order by ReservationDay 

的預訂表可以包含任何給定的日曆日期的任何數量的記錄,或者根本沒有。 CalendarOverrides表可以爲每個日曆日期準確包含1或0個記錄。我試圖將結果合併在一起,但沒有完全正確。

這裏是我的結果集:

enter image description here

預訂23天的問題。我想那些2個記錄在1,從而合併該5倍的值是:
23,6,8,1,[空白/空]

澄清:
- ReservationDay是在兩個表中(名爲CalendarDate在CalendarOverrides)
- SleighSeats和CabSeats只存在於預訂表
- IsFullMoon和OverrideText只有在CalendarOverrides表中存在


在工會已經將合併所有預訂同一ReservationDay記錄的頂部查詢,但我怎樣才能合併底部查詢中的記錄與記錄中的記錄e頂部查詢,對於同一ReservationDay? (所以有從不爲任何一天超過1分的紀錄。)

回答

2
select 
    ReservationDay, 
    max(SleighSeats) as SleighSeats, 
    max(CabSeats) as CabSeats, 
    max(IsFullMoon) as IsFullMoon, 
    max(OverrideText) as OverrideText 
from (

    select 
     day(ReservationDate) as ReservationDay, 
     sum(SleighSeats) as SleighSeats, 
     sum(CabSeats) as CabSeats, 
     0 as IsFullMoon, 
     '' as OverrideText 
    from Reservations 
    where month(ReservationDate) = 2 
    group by ReservationDate 
    union 
    select 
     day(CalendarDate) as ReservationDay, 
     0 as SleighSeats, 
     0 as CabSeats, 
     IsFullMoon, 
     OverrideText 
    from CalendarOverrides 
    where month(CalendarDate) = 2 
    group by CalendarDate, IsFullMoon, OverrideText 
) as subtbl 
group by ReservationDay 
order by ReservationDay, IsFullMoon 
+0

你是100%真棒!感謝您的快速幫助。 – HerrimanCoder 2013-02-21 06:23:53

+0

這隻會工作,因爲它是MySQL。在同一個select子句中使用聚合作爲非聚合而沒有「GROUP BY」子句是非確定性的,恕我直言,這是一種災難處方。 – 2013-02-21 06:31:05

+0

@lc。感謝那。這是我的一個快速答案,我希望SweatCoder能夠測試並改進查詢。無論如何,我編輯的查詢和最新版本的SQL Server也工作,但也許你的答案更好。 – iiro 2013-02-21 06:50:14

0
select day(ReservationDate) as ReservationDay, sum(SleighSeats) as SleighSeats, 
    sum(CabSeats) as CabSeats, COALESCE(IsFullMoon,0) as IsFullMoon, 
    COALESCE(OverrideText,'') as OverrideText 
from Reservations 
left outer join CalendarOverrides 
    ON Reservations.ReservationDate = CalendarOverrides.CalendarDate 
where month(ReservationDate) = 2 
group by ReservationDate, IsFullMoon, OverrideText 

union all 

select day(CalendarDate) as ReservationDay, 0 as SleighSeats, 
    0 as CabSeats, IsFullMoon, 
    OverrideText 
from CalendarOverrides 
where month(CalendarDate) = 2 
and NOT EXISTS 
(
    SELECT 1 
    FROM Reservations 
    WHERE Reservations.ReservationDate = CalendarOverrides.CalendarDate 
) 

order by ReservationDay 

如果您的RDBMS支持的話,你也應該能夠做到這一點會完全加入(這可能因爲where子句中的COALESCE?):

select day(COALESCE(ReservationDate, CalendarDate)) as ReservationDay, 
    COALESCE(sum(SleighSeats),0) as SleighSeats, 
    COALESCE(sum(CabSeats),0) as CabSeats, COALESCE(IsFullMoon,0) as IsFullMoon, 
    COALESCE(OverrideText,'') as OverrideText 
from Reservations 
full join CalendarOverrides 
    ON Reservations.ReservationDate = CalendarOverrides.CalendarDate 
where month(COALESCE(ReservationDate, CalendarDate)) = 2 
group by ReservationDate, CalendarDate, IsFullMoon, OverrideText 
order by ReservationDay 
+0

完全連接在MySQL中不起作用,僅供參考。 – HerrimanCoder 2013-02-21 06:27:02

+0

但是,感謝您提供解決方案。 Preesh。 – HerrimanCoder 2013-02-21 06:27:23

+0

@SweatCoder夠公平的,改寫了一下。 – 2013-02-21 06:29:37