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
、[空白/null]

になるようにします。明確にするために:
- ReservationDay は両方のテーブルにあります (CalendarOverrides の CalendarDate という名前)
- SleighSeats と CabSeats が存在します。 Reservations テーブルのみ
- IsFullMoon と OverrideText は CalendarOverrides テーブルにのみ存在し


ますユニオンの一番上のクエリは、同じ ReservationDay のすべての Reservations レコードを既にマージしていますが、一番下のクエリのレコードを一番上のクエリのレコードとマージするにはどうすればよいですか?同じ予約日ですか?(そのため、特定の日に複数のレコードが存在することはありません。)

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 がサポートしている場合は、これも完全結合で実行できるはずです (これはCOALESCE、where 句が原因で遅くなる可能性があります)。

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 に答える