2016-11-03 2 views
0

Ich versuche, ein SQL-Skript zu generieren Anzahl der Reisenden in ein Land auf der Grundlage dieser Bedingungen zu schaffen:SQL-Skript eine Schleife über alle Datensätze mit bestimmten Bedingung

  • Land
  • Natur Reise
  • Jahr
  • Dauer
    • über 1 Monat
    • L ess als 1 Woche
    • mehr als 1 Woche, aber weniger als 1 Monat

Das Endziel ist, so etwas zu bekommen (für 1 Jahr/1 Land):

enter image description here

Ich habe versucht, den manuellen Weg (dauert mich eine lange Zeit) der Generierung einzelner SQL-Anweisungen, aber ich bin mir nicht sicher, wie es über eine PL/SQL-Schleife zu tun. Schätze, wenn mir jemand zeigen kann, wie.

Unten ist die Tabellenstruktur in meiner Datenbank mit den relevanten Feldern.

enter image description here

enter image description here

enter image description here

Das ist, was ich zur Zeit, aber ich bin nicht sicher über die Anzahl der Reisenden bekommen:

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') 

Ich versuchte Summe mit (number_of_travellers) aber es hat nicht funktioniert. Vielen Dank für jede Hilfe!

+0

Versuchen Sie dies: 'Summe (a.number_von_Travellers) als Anzahl_von_Trips' und Gruppe von' a.trip_id' und lass es mich wissen –

Antwort

0

Ich schlage vor, Sie einige Ansichten erstellen, um die Dinge zu helfen zu brechen und wiederholte Code zB zu vermeiden:

VW_ITINERARY_DURATION { ITINERARY_ID, DURATION_IN_DAYS, DURATION_IN_MONTHS } 

... deren Dauern werden verwendet, um zu erstellen:

VW_ITINERARY_NARRATIVE { ITINERARY_ID, DURATION_NARRATIVE, SORT_ORDER }; 

Dann ist es eine einfache Fall von natural join in den Tabellen TB_TRAVELITINERARY, TB_TRIP, TB_COUNTRY und VW_ITINERARY_NARRATIVE. Wenn Sie dann die Summierung in dieser einfachen Abfrage versuchen, können die Dinge klarer werden.

Verwandte Themen