SQL脚本循环遍历具有特定条件的所有记录

时间:2016-11-03 04:06:39

标签: sql database select

我正在尝试创建一个SQL脚本,根据这些条件生成一个国家的旅行者数量:

  • 国家
  • 旅行性质
  • 逗留时间
    • 超过1个月
    • 不到一周
    • 超过1周但不到1个月

最终目标是得到这样的东西(1年/ 1个国家):

enter image description here

我尝试过生成单个SQL语句的手动方式(花了我很长时间),但我不确定如何通过 PL / SQL循环。感谢是否有人能告诉我如何。

以下是我的数据库中包含相关字段的表格结构。

enter image description here

enter image description here

enter image description here

这就是我目前所拥有的,但我不确定如何获得旅客人数:

select c.country_name as country,
   a.nature_of_travel,
   case d.rn 
     when 1 then 'More than 1 month' 
     when 2 then 'Less than 1 week' 
     else 'Between 1 week and 1 month'
   end length_of_stay,
   count(*) number_of_trips, -- Supposed to use sum(number_of_travellers) here
   to_char(b.from_date,'YYYY') year   
from TB_TRAVELITINERARY b 
join TB_TRIP a on a.trip_id=b.trip_id   
join TB_COUNTRY c on b.country_code= c.country_code 
join (select rownum rn from dual connect by level < 4) d on 
  case when add_months(b.from_date,1) < b.to_date then 1
       when b.from_date+7 > b.to_date then 2
       else 3
  end = d.rn
 group by c.country_name,
    a.nature_of_travel,
    case d.rn 
      when 1 then 'More than 1 month' 
      when 2 then 'Less than 1 week' 
      else 'Between 1 week and 1 month'
    end,
    to_char(b.from_date,'YYYY') 

我尝试使用sum(number_of_travellers),但它没有用。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我建议您创建一些视图以帮助解决问题并避免重复代码,例如:

VW_ITINERARY_DURATION { ITINERARY_ID, DURATION_IN_DAYS, DURATION_IN_MONTHS }

...其持续时间用于创建:

VW_ITINERARY_NARRATIVE { ITINERARY_ID, DURATION_NARRATIVE, SORT_ORDER };

然后,natural join表格TB_TRAVELITINERARYTB_TRIPTB_COUNTRYVW_ITINERARY_NARRATIVE就是一个简单的例子。如果您在这个简单的查询中尝试求和,那么事情可能会变得更加清晰。