2017-01-03 3 views
0

У меня возникли проблемы с этим запросомошибка с агрегатной функцией, но разбирает штраф

CREATE VIEW qryMonthlyFeesToCollectSummary1 
AS 
    SELECT ContractID, 
     Round(Sum([CreditAmount] * ((1 
             + COALESCE((SELECT Max(MonthlyRate) 
                FROM tblCases 
                WHERE LEFT(CaseID, 4) = [ContractID] AND CaseStatus = 'Open Case'), 
                0.0199))/30) * Exp(30 - 1)), 2) AS InterestCredit 
    FROM tblCredits 
    GROUP BY tblCredits.ContractID, 
      (SELECT Count(*) 
      FROM tblInterestPayments 
      WHERE ContractMainID = [ContractID] 
        AND (PaymentDate IS NULL 
          OR (PaymentDate IS NOT NULL 
           AND Bounced <> 0 
           AND RetrySuccessful IS NULL))) 
    HAVING (SELECT Count(*) 
      FROM tblInterestPayments 
      WHERE ContractMainID = [ContractID] 
       AND (PaymentDate IS NULL 
         OR (PaymentDate IS NOT NULL 
          AND Bounced <> 0 
          AND RetrySuccessful IS NULL))) = 0; 

ошибки его, как показано ниже, даже если он разбирает хорошо. Пожалуйста помоги! Спасибо!

Msg 144, Level 15, State 1, процедура qryMonthlyFeesToCollectSummary1, линии 11 не может использовать агрегат или подзапрос в выражении используется для группы по списку в предложения GROUP BY.

Msg 130, Level 15, State 1, процедура qryMonthlyFeesToCollectSummary1, линии 5 Невозможно выполнить агрегатную функцию выражения , содержащей совокупность или подзапрос.

+0

Почти наверняка вам нужны некоторые присоединяется там вместо подзапросов. – Anand

+0

Я попытался использовать соединение LEFT OUT, но он все еще прослушивается. Это был оригинальный код. То же самое для второго оператора select в разделе HAVING. Всем спасибо. –

ответ

0

Я думаю, что это то, что вы ищете:

CREATE VIEW qryMonthlyFeesToCollectSummary1 
AS 
    SELECT ContractID, 
     Round(Sum([CreditAmount] * ((1 
             + COALESCE((SELECT Max(MonthlyRate) 
                FROM tblCases 
                WHERE LEFT(CaseID, 4) = [ContractID] AND CaseStatus = 'Open Case'), 
                0.0199))/30) * Exp(30 - 1)), 2) AS InterestCredit 
    FROM tblCredits 
    WHERE (SELECT Count(*) 
      FROM tblInterestPayments 
      WHERE ContractMainID = tblCredits.[ContractID] 
       AND (PaymentDate IS NULL 
         OR (PaymentDate IS NOT NULL 
          AND Bounced <> 0 
          AND RetrySuccessful IS NULL))) = 0 
    GROUP BY tblCredits.ContractID; 
0

Я думаю, что я получил это право. Попытайтесь правильно присвоить имена таблиц и каждый столбец, используемый в запросе.

CREATE VIEW qryMonthlyFeesToCollectSummary1 
AS 
    SELECT tblCredits.ContractID 
     , Round(Sum([CreditAmount] * ((1 
       + COALESCE(Max(MonthlyRate) , 0.0199))/30) 
       * Exp(30 - 1)), 2) AS InterestCredit 
    FROM tblCredits 
    INNER JOIN tblCases   ON LEFT(CaseID, 4) = [ContractID] 
           AND CaseStatus = 'Open Case' 
    INNER JOIN tblInterestPayments ON ContractMainID = [ContractID] 
    WHERE PaymentDate IS NULL 
     OR (PaymentDate IS NOT NULL 
      AND Bounced <> 0 
      AND RetrySuccessful IS NULL) 
    GROUP BY tblCredits.ContractID 
    HAVING Count(*) = 0; 
+0

Практически там. По-прежнему возникает ошибка в совокупности MAX. –

0

Вы можете попробовать следующее:

SELECT 
    Credits.ContractID, 
    ROUND(SUM(Credits.CreditAmount * ((1 + COALESCE(Cases.MaxMonthlyRate,0.0199))/30) * Exp(30 - 1)), 2) AS InterestCredit 
FROM 
    tblCredits Credits 
    OUTER APPLY(
     SELECT 
      Max(Cases.MonthlyRate) MaxMonthlyRate 
     FROM 
      tblCases Cases 
     WHERE 
      LEFT(Cases.CaseID, 4) = Credits.ContractID 
      AND Cases.CaseStatus = 'Open Case' 
    )Cases 
WHERE 
    NOT EXISTS(
     SELECT NULL 
     FROM tblInterestPayments Payments 
     WHERE 
      Payments.ContractMainID = Credits.ContractID 
      AND ( 
       Payments.PaymentDate IS NULL 
       OR ( 
        Payments.PaymentDate IS NOT NULL 
        AND Payments.Bounced <> 0 
        AND Payments.RetrySuccessful IS NULL 
       ) 
      ) 
    ) 
GROUP BY 
    Credits.ContractID 

Ошибки вы испытываемые встречаются при попытке использовать агрегатную функцию (MAX, MIN, AVG и т.д.) внутри подзапроса, который внутри выражения, которое уже использует агрегированную функцию. Удалите их, я переместил этот подзапрос из предложения select и во внешнее приложение. Я использовал Outer apply, потому что вы отметили вопросы как SQL-сервер, а подзапрос выполняет агрегат. В других базах данных вы должны использовать левое соединение.

Кроме того, я переместил подзапрос tblInterestPayments в предложение NOT EXISTS. Поскольку вы проверяете отсутствие строк в таблице, соответствующей критериям, это имеет смысл.

0

попробовать что-то вроде:

CREATE VIEW qryMonthlyFeesToCollectSummary1 
AS 
    SELECT 
    ContractID, 
    ROUND(SUM([CreditAmount] * ((1 + COALESCE(max_monthlyRate, 0.0199))/30) * 
EXP(30 - 1)), 2) AS InterestCredit 
     FROM 
     tblCredits c LEFT OUTER JOIN 
     (SELECT 
      ContractMainID 
     FROM 
      tblInterestPayments 
     WHERE 
      PaymentDate IS NULL OR 
      ( Bounced <> 0 AND RetrySuccessful IS NULL)) i ON 
     c.ContractID = i.ContractMainID LEFT OUTER JOIN 
     (SELECT 
      LEFT(CaseID, 4) AS left_caseID4, 
      MAX(MonthlyRate) AS max_monthlyRate 
     FROM 
      tblCases 
     WHERE 
      CaseStatus = 'Open Case' 
     GROUP BY 
      LEFT(caseid,4)) s ON 
     c.contractID = s.left_caseID4 
     WHERE 
     i.ContractMainID IS NULL 
     GROUP BY 
     ContractID