【问题标题】:Microsoft Report Builder TSQL query issueMicrosoft Report Builder TSQL 查询问题
【发布时间】:2025-12-06 07:45:01
【问题描述】:

我编写了以下 TSQL 查询并在 Microsoft Report Builder 中运行它。我的问题是一部分工作不正常。任何信息都会非常有帮助。谢谢。

  • 注意 - (SELECT ProcessDate FROM ufnARCUGetLatestProcessDate()) 返回运行查询的日期。这是我们的标准功能之一。

这是我遇到问题的部分。由于某种原因,它没有找到关闭日期为 NULL 的贷款。例如,我正在测试的帐户有一笔未结贷款,但当我应该收到 1 时,它返回的值是 0。有人看到我可能遗漏了什么吗?

    (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

【问题讨论】:

  • 您真的应该帮助我们为您提供更多帮助。您的第一个 sn-p 孤立是不可理解的,也无法运行,而第二个 sn-p 是巨大的。请先缩小问题范围,尝试创建sscce。此外,如果您告诉我们您尝试解决的问题以及遇到的问题,将会有所帮助。

标签: tsql reporting-services reportbuilder3.0


【解决方案1】:

我假设如果贷款仍然“开放”,那么 L.LoanCloseDate 将为空。

在这种情况下,您的查询问题是

 L.LoanCloseDate IS NOT NULL

此标准意味着您只计算 已关闭 贷款,即具有 LoanClosedDate 值的贷款。您似乎需要的是相反的情况,即未结贷款。因此,您可能只需将此条件更改为

 L.LoanCloseDate IS NULL

以便您计算 未结 贷款。

【讨论】:

  • 顺便说一句,我还将通过声明一个局部变量 @ ProcessDate 并使用对该函数的一次调用来替换您对 ufnARCUGetLatestProcessDate() 函数的多次调用。然后用@ProcessDate 替换对该函数的其他调用。这将减少查询开销,并使您的代码更具可读性。