2017-12-31 169 views
0

In hier ich werde nicht nur eine Zeile Ergebnis als Rechnung für TourId = 4, aber es wird gibt es Anzahl der Zeilen mit TourId = 4Wenn ich eine Funktion aufrufen, um ein Zeilenergebnis zu erhalten, gibt es die Anzahl der Zeilen, warum?

--Functions 
--(1)Tour Bill 
-- when enter a TourID it will genarate Tour Cost 
--Multi statement table valued functions 


CREATE FUNCTION dbo.Tour_Bill(@TourID int) 
RETURNS @Bill TABLE 
( TourID int, 
    ItineraryID int, 
    StartDate date, 
    EndDate date, 
    Duration int, 
    Distance float, 
    CustomerId varchar(30) 
    Name varchar(180) NOT NULL, 
    ContractNo varchar(12) NOT NULL, 
    GuideID int, 
    PaymentForGuide money, 
    SpecielActivityCost money, 
    VisitingPlaceTicketCost money, 
    NumberOfPeople int, 
    CostForMeal money, 
    Accomadation varchar(100), 
    TotalAccommodationCost money, 
    TourPackegeCost money, 
    TotalSpecielActivityCost money, 
    TotalVisitingPlaceTicketCost money, 
    GRAND_COST money 
) 
AS 
BEGIN 

INSERT INTO @Bill 
     SELECT Tour.TourId, 
        Itinerary.ItineraryId, 
        StartDate, 
        EndDate, 
        DATEDIFF(day,StartDate,EndDate) AS Duration, 
        EstTravelDist, 
        CustomerId, 
        FirstName+' '+LastName AS FullName, 
        ContactNo, 
        Guide.IdNo, 
        CAST(500 * DATEDIFF(day,StartDate,EndDate) AS money) AS PaymentForGuide, 
        SpecialActivity.Cost AS SpecialActivityCost, 
        VisitingPlaces.Cost AS VisitingPlacesCost, 
        NumberOfPeople, 
        CAST(UnitPrice * DATEDIFF(day,StartDate,EndDate) * NumberOfPeople AS money) AS CostForMeal, 
        Location AS Accomadation, 
        CAST(UnitPrice * DATEDIFF(day,StartDate,EndDate) AS money) AS TotalAccommodationCost, 
        CAST(EstTravelDist * 40 AS money) AS TourPackegeCost, 
        SpecialActivity.Cost * NumberOfPeople AS TotalSpecielActivityCost, 
        VisitingPlaces.Cost * NumberOfPeople AS TotalVisitingPlaceTicketCost, 
        CAST(EstTravelDist * 40 + SpecialActivity.Cost * NumberOfPeople + VisitingPlaces.Cost * NumberOfPeople + 500 * DATEDIFF(day,StartDate,EndDate) 
        + UnitPrice * DATEDIFF(day,StartDate,EndDate) + UnitPrice * DATEDIFF(day,StartDate,EndDate) * NumberOfPeople AS money) AS GRAND_COST 

    FROM (((((((((Itinerary 
      INNER JOIN SpecialActivity ON 
      Itinerary.ItineraryId = SpecialActivity.ItineraryId) 
      INNER JOIN VisitingPlaces ON 
      VisitingPlaces.ItineraryId = Itinerary.ItineraryId) 
      INNER JOIN Tour ON 
      Tour.TourId = Itinerary.TourId) 
      INNER JOIN Guide ON 
      Guide.TourId = Tour.TourId) 
      INNER JOIN Vehicle ON 
      Vehicle.TourId = Tour.TourId) 
      INNER JOIN Accommodation ON 
      Accommodation.TourId = Tour.TourId) 
      INNER JOIN Participant ON 
      Participant.TourId = Tour.TourId) 
      INNER JOIN Person ON 
      Person.IdNo = Guide.IdNo) 
      INNER JOIN Contract ON 
      Itinerary.ItineraryId = Contract.ItineraryId) 
    WHERE Tour.TourId = 4 
RETURN; 
END 

--How to Call the Function 

SELECT * FROM dbo.Tour_Bill(101) 

---These are the tables 
create table Itinerary(
    ItineraryId int primary key identity, 
    Description varchar(50)NOT NULL, 
    TourId int, 
    CONSTRAINT FK_Tour3 FOREIGN KEY (TourId) 
    REFERENCES Tour(TourId) 
); 
--ALTER TABLE ADD COLUMN Distance 
ALTER TABLE Itinerary 
ADD EstTravelDist float NOT NULL 

create table SpecialActivity(
    Activity varchar(100), 
    ItineraryId int NOT NULL, 
    Dates date , 
    PRIMARY KEY(Activity,ItineraryId,Dates),  
    CONSTRAINT FK_Dates3 FOREIGN KEY (Dates,ItineraryId) 
    REFERENCES Dates(Dates,ItineraryId),   
); 
---ADD COLUMN Cost 
ALTER TABLE SpecialActivity 
ADD Cost money NOT NULL 

create table VisitingPlaces(
    Place varchar(100), 
    ItineraryId int, 
    Dates date ,  
    PRIMARY KEY(Place,ItineraryId,Dates),  
    CONSTRAINT FK_Dates5 FOREIGN KEY (Dates,ItineraryId) 
    REFERENCES Dates(Dates,ItineraryId),   
); 
---ADD COLUMN Cost 
ALTER TABLE VisitingPlaces 
ADD Cost money NOT NULL 

create table Person(
    IdNo varchar(30) primary key, 
    FirstName varchar(50) NOT NULL , 
    LastName varchar (100) NOT NULL, 
    Gender char(1) NOT NULL, 
    Nationality varchar (50) NOT NULL, 
    Email varchar(100) UNIQUE, 
    Fax varchar(12) , 
    PostBox varchar (6) NOT NULL, 
    Street varchar (60) NOT NULL, 
    City varchar (60) NOT NULL, 
    Province varchar (60) NOT NULL, 
    Country varchar(100) NOT NULL  
); 

create table Tour(
    TourId int PRIMARY KEY IDENTITY, 
    ResavationDate date NOT NULL, 
    StartDate date NOT NULL, 
    EndDate date NOT NULL, 
    NumberOfPeople int NOT NULL, 
    TourStatus varchar(20) NOT NULL, 
    CustomerId varchar(30), 
    CONSTRAINT FK_Person3 Foreign key (CustomerId) 
    REFERENCES Person(IdNo) 
); 


create table Guide(
    IdNo VARCHAR(30) PRIMARY KEY , 
    GovermentRegistrationNo varchar(10) NOT NULL UNIQUE, 
    YearsOfExperence int NOT NULL, 
    TourId int, 
    CONSTRAINT FK_Tour2 FOREIGN KEY (TourId) 
    REFERENCES Tour(TourId), 
    CONSTRAINT FK_Person4 FOREIGN KEY (IdNo) 
    REFERENCES Guide(IdNo) 
); 

create table Participant(
    ParticipantId varchar(30) primary key, 
    Name varchar(50) NOT NULL, 
    ContactNo varchar(30) NOT NULL, 
    PickupLocation varchar(50) NOT NULL, 
    DropLocation varchar(50) NOT NULL, 
    TourId int 
    CONSTRAINT FK_Tour FOREIGN KEY (TourId) REFERENCES Tour(TourId) 
); 

create table Accommodation(
    ContractNo int primary key , 
    Location varchar (50) NOT NULL, 
    Class varchar(10), 
    RentedRoomFacilitiesDescription varchar(1000), 
    PvtRoomFacilitiesDescription varchar(1000), 
    T1 bit, 
    T2 bit, 
    T3 bit, 
    Dates date, 
    ItineraryId int, 
    TourId int, 
    CONSTRAINT Fk_Dates FOREIGN KEY (Dates,ItineraryId) 
    REFERENCES Dates(Dates,ItineraryId),  
    CONSTRAINT FK_Tour4 FOREIGN KEY (TourId) 
    REFERENCES Tour(TourId), 
); 

create table Contract(
    ContractNo int primary key IDENTITY, 
    PricingCriteria varchar(100), 
    UnitPrice money, 
    MiniPeople int, 
    MaxPeople int, 
    ContractType varchar(100), 
    FinancialPenalty money, 
    ItineraryId int NOT NULL, 
    SupplierId int, 
    CONSTRAINT FK_Itinerary2 FOREIGN KEY (ItineraryId) 
    REFERENCES Itinerary(ItineraryId), 
    CONSTRAINT FK_SupplierRegNo FOREIGN KEY (SupplierId) REFERENCES Supplier(SupplierRegNo) 
); 
+0

Wenn es mehrere Zeilen mit derselben Tour-ID gibt, was möchten Sie dann? Eine Gesamtsumme einiger Felder für diese Tour. Oder eine Zählung, vielleicht? Bitte seien Sie klar, was Ihre Anforderung ist und geben Sie am besten ein Beispiel für Ihre gewünschte Leistung an. Wenn Sie mehrere Zeilen mit der gleichen ID haben, müssen Sie entweder eine Aggregatabfrage erstellen oder weitere Einschränkungen in Ihrer where-Klausel treffen, um sicherzustellen, dass nur eine Zeile zurückgegeben werden kann. – ADyson

+0

Es gibt keine mehrere Zeilen mit der gleichen ID und ich werde nicht die Gesamtkosten jeder Tour erhalten. @ADyson – rajitha

+0

Oben haben Sie gesagt "es gibt eine Anzahl von Zeilen mit TourId = 4". Daher mein Kommentar. – ADyson

Antwort

0

Lernen zu schreiben Code zu erhalten, die lesbar ist. Und dann lernen Sie, Ihren Code zu debuggen. Sie haben in Ihrer Funktion:

WHERE Tour.TourId = 4 

So Ihre Parameter dienen derzeit keinen anderen Zweck als jemanden zu verwirren versucht, die Funktion zu verwenden. Offensichtlich müssen Sie das Literal durch Ihren Parameter ersetzen. Und um der Menschheit willen entfernen Sie all diese lächerlichen Klammern in Ihrer FROM-Klausel - sie dienen keinem Zweck, haben keine Wirkung und machen Ihren Code nur schwieriger zu lesen und zu verstehen.

Verwandte Themen