2016-09-24 1 views
0

日枝に基づいて30日間を表示することができますクエリを取得します:
私はからのデータを表示する必要が **RentalAgreement – CustID,AgreementID(PK) and AgreementDate **Movie Rented – AgreementID(PK), RentalAmount and PercentReductionApplied,MovieID(FK) **Movie – MovieID(PK), Name, Released私は次のように3つのテーブルとそれらの行からデータを抽出するテーブルのデータではなく、現在の日付

過去30日間は現在のデータではなくテーブルに基づいています。 これを達成するにはどうすればよいですか? 私の試み:

SELECT TRIM(CustID),AgreementDate , RentalAmount  
      ,PercentReductionApplied , MovieID , Name , Released 
FROM RentalAgreement, MovieRented, Movie 
WHERE RentalAgreement.AgreementID = MovieRented.AgreementID 
AND Movie.MovieID = MovieRented.MovieID 
AND AgreementDate BETWEEN MAX(AgreementDate) AND MAX(AgreementDate)-30; 

答えて

0

問題がMAX(agreementdate)です。これは集合関数です。WHERE句が処理された後は、クエリの最後の段階(SELECT句内)でしかアクセスできません。つまり、まずMAXを計算するために別のクエリが必要であり、それを全体的な(外側の)クエリのサブクエリとして使用するということです。

現代のSQL標準結合構文を使用することも最善です。これらの両方をまとめる:

SELECT TRIM(CustID),AgreementDate , RentalAmount  
      ,PercentReductionApplied , MovieID , Name , Released 
FROM RentalAgreement 
    join MovieRented on RentalAgreement.AgreementID = MovieRented.AgreementID 
    join Movie  on Movie.MovieID    = MovieRented.MovieID 
    cross join (select max(agreementdate) as max_date from rentalagreement) m 
where AgreementDate BETWEEN m.max_date AND m.max_date - 30; 

なぜTRIM(custID)する必要がありますか?それはまれです。また、MovieRentedでAgreementIDがPRIMARYキーであることは奇妙です。しかし、これはあなたの質問がうまくいかない理由ではありません。

0

DECLARE @StartDate DATETIME、@終了日DATETIME

SELECT @StartDate = MAX(AgreementDate)RentalAgreement FROM SET @EndDate = DATEADD(DAY、-30、開始日@)

SELECT TRIM(お客様ID) 、AgreementDate、RentalAmount RentalAgreement、MovieRented、映画 RentalAgreement.AgreementID = MovieRented.AgreementID AND Movie.MovieID = MovieRented.MovieID AND AgreementDate Bから をリリース
、PercentReductionApplied、MOVIEID、名前、 ETWEEN @StartDate AND @ EndDate

関連する問題