2017-05-03 2 views
0

私のコードに問題があり、選択したクエリ内で集計関数を受け入れていないようです。 DATEDIFF(MONTH,MIN(LoanDateStart),MAX(LoanPaymentDue))で達成しようとしているのは、合計月数を取得し、残りのクエリを計算するために月数を使用したいということです。Select StatementでAggregateを使用する方法

私はこのエラーを得た:

Msg 130, Level 15, State 1, Line 11 Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

は、私は他の方法で回避を達成できることがとにかくありますか?

クエリ

SELECT 
ISNULL(SUM((CAST(((((lt.InterestRate/100) * lc.LoanAmount) + 
lc.LoanAmount)/((dbo.fnNumberOfYears(CONVERT(VARCHAR(15), LoanDateStart, 
101), CONVERT(VARCHAR(15), LoanPaymentDue, 101)) * DATEDIFF(MONTH, 
MIN(LoanDateStart), MAX(LoanPaymentDue))) * 2)) AS DECIMAL(18,2)))),0) 
FROM LoanContract lc 
INNER JOIN LoanType lt ON lt.LoanTypeID = lc.LoanTypeID 
WHERE lc.LoanTypeID = 1 AND lc.EmployeeID = 5 

答えて

0

次のことを試してみてください...

SELECT ISNULL(SUM((CAST(((((lt.InterestRate/100) * 
            LoanContract.LoanAmount) + 
           LoanContract.LoanAmount)/
           ((dbo.fnNumberOfYears(CONVERT(VARCHAR(15), 
                   LoanDateStart, 
                   101), 
                 CONVERT(VARCHAR(15), 
                   LoanPaymentDue, 
                   101)) * 
            monthsDifference) * 
           2)) AS DECIMAL(18, 
                2)))), 
       0) 
FROM (SELECT LoanContractID AS LoanContractID, 
       DATEDIFF(MONTH, 
         MIN(LoanDateStart), 
         MAX(LoanPaymentDue)) AS monthsDifference 
     FROM LoanContract 
     GROUP BY LoanContractID 
    ) AS monthsDifferenceFinder 
INNER JOIN LoanContract ON LoanContract.LoanContractID = monthsDifferenceFinder.LoanContractID 
INNER JOIN LoanType lt ON lt.LoanTypeID = LoanContract.LoanTypeID 
WHERE lc.LoanTypeID = 1 
    AND lc.EmployeeID = 5 

あなたがいないと私はLoanContractの主キーの代わりにLoanContractIDを使用していることに注意してくださいそれが何であるかを述べました。

SUM()(集約関数)がMIN()MAX()の結果で動作していたため、それ自体が集計関数でした。これは混乱したSQL-Serverです。

私は、各レコードの主キーではなくLoanContractの一意の識別子に基づいて、各LoanContractの2つの値の差を決定するサブクエリを作成してこの問題を回避しました。 ()3NF(第3正規形であなたのデータか?)サブクエリの

結果は、効果的にそのLoanContractための各レコードにそれぞれLoanContractmonthsDifference値を付加し、LoanContractIDに基づいてLoanContractに接合されています。

SUM()は、正確に集計された値を集計しようとするのではなく、検索された値に作用することができます。

ご不明な点がございましたら、お気軽にコメントを投稿してください。

+2

説明が回答に追加されました。 – toonice

+0

この素晴らしい説明をありがとう、私は今なぜ完全に理解しています。そんなにありがとう@@onice –

+0

ようこそ。喜んで助けになる。 – toonice

0

とにかく、私はLEFT OUTER JOINを使用しています、今の問題を修正しました。ここで

は私のコードです:

SELECT 
ISNULL(SUM((CAST(((((lt.InterestRate/100) * lc.LoanAmount) + lc.LoanAmount)/((dbo.fnNumberOfYears(CONVERT(VARCHAR(15), LoanDateStart, 101), CONVERT(VARCHAR(15), LoanPaymentDue, 101)) * x.NumberOfMonths) * 2)) AS DECIMAL(18,2)))),0) 
FROM LoanContract lc 
INNER JOIN LoanType lt ON lt.LoanTypeID = lc.LoanTypeID 
LEFT OUTER JOIN(SELECT 
lc.LoanTypeID AS 'LoanTypeID', 
lc.EmployeeID AS 'EmployeeID', 
(DATEDIFF(MONTH, MIN(LoanDateStart), MAX(LoanPaymentDue))) AS 'NumberOfMonths' 
FROM LoanContract lc 
INNER JOIN LoanType lt ON lt.LoanTypeID = lc.LoanTypeID 
GROUP BY lc.EmployeeID, lc.LoanTypeID) x ON x.EmployeeID = lc.EmployeeID AND x.LoanTypeID = lc.LoanTypeID 
WHERE lc.LoanTypeID = 1 AND lc.EmployeeID = 5 
関連する問題