2013-05-02 4 views
0

Я написал следующий запрос TSQL и запускаю его в Microsoft Report Builder. Моя проблема - одна часть работает некорректно. Любая информация была бы очень полезной. Благодарю.Вывод SQL-запроса Builder QQL

  • Примечание - (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) возвращает дату выполнения запроса. Это одна из наших стандартных функций.

Это та часть, с которой у меня возникают проблемы. По какой-то причине он не находит кредиты, у которых есть дата закрытия NULL. Например, учетная запись, на которую я тестирую, имеет открытый кредит, но значение, которое оно возвращает, равно 0, когда я должен получить 1. Кто-нибудь видит, что я могу потерять?

(SELECT COUNT(*) -- Check if there are no open loans 
    FROM arcu.vwARCULoan AS L 
    WHERE A.ACCOUNTNUMBER=L.AccountNumber AND 
    L.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    L.LoanCloseDate IS NOT NULL)=0 AND -- END Check if there are no open loans 

Ниже приводится весь запрос.

SELECT 
    A.ACCOUNTNUMBER AS 'Account Number' 
    ,A.AccountBranch AS 'Branch Number' 
    ,A.AccountOpenDate AS 'Account Open Date' 
    ,A.AccountActivityDate AS 'Last Activity Date' 
    ,N.NameFirst+' '+N.NameLast AS 'Member Name' 
FROM 
    arcu.vwARCUAccount AS A 
LEFT OUTER JOIN arcu.vwARCUName AS N 
ON A.ACCOUNTNUMBER = N.AccountNumber 
WHERE 
    A.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    A.AccountCloseDate IS NULL AND 
    A.AccountOpenDate>DATEADD(DAY,-30,A.AccountOpenDate) AND 
    N.NameType=0 AND 
    N.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    (SELECT SUM(S.ShareBalance) -- Check if all shares are zero 
    FROM arcu.vwARCUShare AS S 
    WHERE A.ACCOUNTNUMBER=S.AccountNumber AND 
    S.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    A.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()))=0 AND -- END Check if all shares are zero 
    (SELECT COUNT(*) -- Check if there are no open loans 
    FROM arcu.vwARCULoan AS L 
    WHERE A.ACCOUNTNUMBER=L.AccountNumber AND 
    L.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    A.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    L.LoanCloseDate IS NOT NULL)=0 AND -- END Check if there are no open loans 
    (SELECT COUNT(*) --Check if tracking records exist 
    FROM arcu.vwARCULoanTracking AS T 
    WHERE A.ACCOUNTNUMBER=T.AccountNumber AND 
    T.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    A.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    T.LoanTrackingType IN(@TRACKINGTYPES))=0 AND --END Check if tracking records exist 
    (SELECT COUNT(*) 
    FROM arcu.vwARCUInventory AS I 
    WHERE A.ACCOUNTNUMBER=I.InventoryAccountNumber AND 
    I.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    A.ProcessDate = (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) AND 
    I.InventoryStatus=2 AND 
    I.InventoryType IN (@INVENTORYTYPE))=0 
ORDER BY A.ACCOUNTNUMBER 
+0

Вы действительно должны помочь нам помочь вам еще. Ваш первый фрагмент в изоляции не понятен и не может быть запущен, а второй фрагмент просто огромен. Сначала сушите проблему, попробуйте создать [sscce] (http://sscce.org). Кроме того, это поможет, если вы сообщите нам, что вы пытались решить, и какие проблемы вы столкнулись. – Jeroen

ответ

0

Я предполагаю, что если кредит все еще «открыт», то L.LoanCloseDate будет null.

В этом случае проблема с вашим запросом является

L.LoanCloseDate IS NOT NULL 

Этот критерий означает, что вы только подсчет закрытые кредиты, то есть кредиты, которые имеют значение в LoanClosedDate. То, что вам кажется нужным, является обратным для этого, то есть открытым кредитам. Таким образом, вы, вероятно, просто нужно изменить эти критерии

L.LoanCloseDate IS NULL 

так, что вы рассчитываете открытых кредитов.

+1

В качестве альтернативы я также заменил бы ваши многочисленные вызовы функции ufnARCUGetLatestProcessDate(), объявив локальную переменную @ ProcessDate и установив ее одним вызовом этой функции. Затем замените другие вызовы на эту функцию на @ProcessDate. Это уменьшит накладные расходы на запрос, а также сделает ваш код более читаемым. – Nathan

Смежные вопросы