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

Reservations 表可以包含任何给定日历日期的任意数量的记录,或者根本不包含任何记录。CalendarOverrides 表可以正好包含每个日历日期的 1 条或 0 条记录。我正在尝试将结果合并在一起,但并不完全正确。

这是我的结果集:

在此处输入图像描述

预订第 23 天是个问题。我希望将这 2 条记录合并为 1,以便 5 个值是: 23、6、8、1
、[空白/空]

澄清:
- ReservationDay 在两个表中(在 CalendarOverrides 中命名为 CalendarDate)
- SleighSeats 和 CabSeats 存在仅在 Reservations 表中
- IsFullMoon 和 OverrideText 仅存在于 CalendarOverrides 表


中联合中的顶部查询将已经合并同一 ReservationDay 上的所有 Reservations 记录,但是如何将底部查询中的任何记录与顶部查询中的记录合并,为同一个预订日?(因此任何一天的记录都不会超过 1 条。)

4

2 回答 2

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
于 2013-02-21T06:16:49.763 回答
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 支持它,您也应该能够执行完全连接(由于COALESCEwhere 子句,这可能会更慢?):

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
于 2013-02-21T06:20:55.053 回答