Oracle查询将行信息转移到列中

时间:2013-10-11 15:30:55

标签: sql oracle

我有一个表格,用于存储有关分支的开启和关闭时间的信息,如下所示:

LOCATION   DAYOFTHEWEEK OPENORCLOSE       TIME
---------- ------------ ----------- ----------
AUSTIN         SUN       Open              1730
AUSTIN         MON       Close              200
AUSTIN         MON       Open               830
AUSTIN         TUE       Close              200
AUSTIN         TUE       Open               830
AUSTIN         WED       Close              200
AUSTIN         WED       Open               830
AUSTIN         THU       Close              200
AUSTIN         THU       Open               830
AUSTIN         FRI       Close              200
AUSTIN         FRI       Open               830
AUSTIN         FRI       Close             1730

正如您所看到的,并非所有日子都必须有开/关日,而且一天可以有多个开/关时间,原因是分支可能在前一天开放,夜班工作然后关闭明天。在这个例子中,奥斯汀分店周日下午5:30开放,周一凌晨2:00关闭,然后在8:30重新开放,一直工作到第二天,直到凌晨2:00。星期五,他们在下午5:30关闭,星期六休息,然后在星期日再次开放,重复相同的周期。

我的问题是,是否可以单独使用select语句返回看起来像这样的行:

LOCATION   DAYOFTHEWEEK   OPENTIME  CLOSETIME
---------- ------------ ---------- ----------
AUSTIN           SUN          1730       null    
AUSTIN           MON          null       200
AUSTIN           MON          830        null
AUSTIN           TUE          null       200
AUSTIN           TUE          830        null
AUSTIN           WED          null       200
AUSTIN           WED          830        null
AUSTIN           THU          null       200
AUSTIN           THU          830        null
AUSTIN           FRI          null       200
AUSTIN           FRI          830       1730

null只是一个占位符,任何值都是-1,或者其他什么也可以。在这种特殊情况下的时间是一个int值,表示时间等值(上午2:00为200,17:30为17:30等)

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为,这将解决您的问题

select location,dayoftheweek,
       case openorclose when 'Open' then time end "OPENSTATUS",
       case openorclose when 'Close' then time end "CLOSESTATUS" from YOUR_TABLE;

LIVE SQLFIDDLE DEMO

答案 1 :(得分:0)

试试这个:

select location,dayofweek,
case when openorclose = 'Open' then time end as OpenTime,
case when openorclose = 'CLOSE' then time end as CloseTime
from TableName;