选择查询Oracle

时间:2018-03-21 20:14:03

标签: sql oracle

我的表格结构如下:

Carrier Terminal    timestamp1
1          1        21-Mar-17
2        101        21-Mar-17
3          2        21-Mar-17
4        202        21-Mar-17
5          3        21-Mar-17
6        303        21-Mar-17

哪里有承运人

flight 1,2 = Delta
flight 3,4 = Air France
flight 5,6 = Lufthanse

Terminal 1,101 = T1
terminal 2,202 = T2
terminal 3,303 = T3

我正在尝试输出如下:

count(Delta), count(Air France), count(Lufthansa), terminal as column output
  2, 0, 0, T1
  0, 2, 0, T2
  0, 0, 2, T3  

我是这样开始的

select count(Delta), count(Air France), count(Lufthansa), terminal
from table_name
where timestamp between '01-Mar-18 07.00.00.000000 AM' and '30-Mar-18 07.59.59.999999 AM'

我正在尝试编写一个查询,以便计算每个终端在特定日期内飞行的不同运营商的数量

任何建议都将受到高度赞赏

2 个答案:

答案 0 :(得分:0)

我做了很多假设让这个工作......我已经提取了你在文中提到的所有规则,我认为这些结构已经存在。否则,请告诉我们:)

with flights(carrier, terminal, departure) as(
    select 1, 1,    timestamp '2017-03-01 01:00:00' from dual union all
    select 2, 101,  timestamp '2017-03-01 02:00:00' from dual union all
    select 3, 2,    timestamp '2017-03-01 03:00:00' from dual union all
    select 4, 202,  timestamp '2017-03-01 04:00:00' from dual union all
    select 5, 3,    timestamp '2017-03-01 05:00:00' from dual union all
    select 6, 303,  timestamp '2017-03-01 06:00:00' from dual
)
,carriers(carrier, carrier_name) as(
    select 1,   'Delta'         from dual union all
    select 2,   'Delta'         from dual union all
    select 3,   'Air France'    from dual union all
    select 4,   'Air France'    from dual union all
    select 5,   'Lufthanse'     from dual union all
    select 6,   'Lufthanse'     from dual
)
,terminals(terminal, terminal_name) as(
    select 1,   'T1' from dual union all
    select 101, 'T1' from dual union all
    select 2,   'T2' from dual union all
    select 202, 'T2' from dual union all
    select 3,   'T3' from dual union all
    select 303, 'T3' from dual
)
select terminal_name
      ,count(case when carrier_name = 'Delta'      then 1 end) as "Delta"
      ,count(case when carrier_name = 'Air France' then 1 end) as "Air France"
      ,count(case when carrier_name = 'Lufthanse'  then 1 end) as "Lufthanse"
  from flights   f 
  join carriers  c using(carrier)
  join terminals t using(terminal)
 where departure >= timestamp '2017-03-01 00:00:00' 
   and departure <  timestamp '2017-04-01 00:00:00'
 group by terminal_name
 order by terminal_name; 

答案 1 :(得分:0)

with
  t ( flight, gate, ts ) as (
    select 1,   1, to_timestamp('21-Mar-17', 'dd-Mon-rr') from dual union all
    select 2, 101, to_timestamp('21-Mar-17', 'dd-Mon-rr') from dual union all
    select 3,   2, to_timestamp('21-Mar-17', 'dd-Mon-rr') from dual union all
    select 4, 202, to_timestamp('21-Mar-17', 'dd-Mon-rr') from dual union all
    select 5,   3, to_timestamp('21-Mar-17', 'dd-Mon-rr') from dual union all
    select 6, 303, to_timestamp('21-Mar-17', 'dd-Mon-rr') from dual
  )
-- End of simulated inputs (for testing only, not part of the solution).
-- SQL query begins below this line. Use your actual table and column names.
select   count (case when flight in (1, 2) then 1 end) as delta
     ,   count (case when flight in (3, 4) then 1 end) as air_france
     ,   count (case when flight in (5, 6) then 1 end) as lufthansa
     ,   case when gate in (1, 101) then 'T1'
              when gate in (2, 202) then 'T2'
              when gate in (3, 303) then 'T3' end as terminal
from     t
where    ts between '21-Mar-17 02.00.00.000000 AM' and '21-Mar-17 10.00.00.000000 AM'
group by case when gate in (1, 101) then 'T1'
              when gate in (2, 202) then 'T2'
              when gate in (3, 303) then 'T3' end
order by terminal
;
     DELTA AIR_FRANCE  LUFTHANSA TERMINAL
---------- ---------- ---------- --------
         2          0          0 T1
         0          2          0 T2
         0          0          2 T3