2013-02-21 101 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