我有一个包含预订的reservations
表格,例如:
date beg end
------------ ------- -------
'2016-06-02' '09:00' '12:00'
'2016-06-03' '14:00' '17:00'
'2016-06-04' '09:00' '17:00'
我需要将其转换为以下视图:
date beg end tod
------------ ------- ------- ----
'2016-06-02' '09:00' '12:00' 'AM'
'2016-06-03' '14:00' '17:00' 'PM'
'2016-06-04' '09:00' '17:00' 'AM'
'2016-06-04' '09:00' '17:00' 'PM'
其中添加的列是tod
(用于一天中的时间),以及 - 这是困难的部分 - 包含跨越整天的预订的重复项。
注意 - 在13:00之前开始的预订仅被视为仅限AM。 13:00后结束的预订仅被视为PM。从13:00开始到13:00之后结束的预订被视为AM和PM,这是行必须重复的原因。
我尝试过JOIN
命令以便能够获得"倍增因子",但加入条件ON
是强制性的,我不会#39;看看它可能是什么,也不应该与我合并的虚拟表的结构。
任何提示都可以帮助我继续完成这项任务?谢谢!
答案 0 :(得分:3)
这似乎是一个奇怪的要求,但union all
似乎是要走的路:
select date, beg, end, 'AM' as tod
from reservations r
where beg < '13:00'
union all
select date, beg, end, 'PM' as tod
from reservations r
where end >= '13:00';
答案 1 :(得分:0)
试试这个:
SELECT t1.*, t2.v
FROM mytable AS t1
LEFT JOIN (SELECT 1 AS id, 'AM' AS v UNION ALL SELECT 2, 'PM') AS t2
ON IF(t1.`beg` < '13:00', 'AM', 'PM') = t2.v OR
IF(t1.`end` < '13:00', 'AM', 'PM') = t2.v
ORDER BY t1.`date`, t2.id
以上查询使用内联表:
id v
----+----
1 | AM
----+----
2 | PM
----+----
ON
谓词基本上是重复的行,从13:00
开始到13:00
之后结束。
答案 2 :(得分:0)
你可以&#34;乘以&#34;连接到常量表的行:
select *
from T
cross apply (
select *
from values ((1), (2)) x(number)
) x
这使所有行加倍。您可以非常灵活地使用此模式。例如,您可以在交叉应用中使用计算值,也可以通过向交叉应用添加where
来减少变量行数。
戈登的union all
解决方案也有效。它会导致不同的查询计划。