Sql server om高余额低付款的租户,而低余额的租户由于某种原因支付了很高的付款。但您的系统可能有其他检查来防止这种情况。我有500-1200个租户,这些租户将保持不变,大约有140K笔交易,这些交易将随着时间的推移而增长。此查询每月只执行一次,因此n^2的增长率是可以
Sql server om高余额低付款的租户,而低余额的租户由于某种原因支付了很高的付款。但您的系统可能有其他检查来防止这种情况。我有500-1200个租户,这些租户将保持不变,大约有140K笔交易,这些交易将随着时间的推移而增长。此查询每月只执行一次,因此n^2的增长率是可以,sql-server,tsql,Sql Server,Tsql,om高余额低付款的租户,而低余额的租户由于某种原因支付了很高的付款。但您的系统可能有其他检查来防止这种情况。我有500-1200个租户,这些租户将保持不变,大约有140K笔交易,这些交易将随着时间的推移而增长。此查询每月只执行一次,因此n^2的增长率是可以接受的。ABS块只是将负变为正。它也保证为负数,因为该选项适用于0以下的所有金额。原始选项是。。。我只是在想,这些中间计算中的一些可能更加模糊,比如ABS(CumulativeBalance-currentpayed)(正如我所命名的那样)。你
om高余额低付款的租户,而低余额的租户由于某种原因支付了很高的付款。但您的系统可能有其他检查来防止这种情况。我有500-1200个租户,这些租户将保持不变,大约有140K笔交易,这些交易将随着时间的推移而增长。此查询每月只执行一次,因此n^2的增长率是可以接受的。ABS块只是将负变为正。它也保证为负数,因为该选项适用于0以下的所有金额。原始选项是。。。我只是在想,这些中间计算中的一些可能更加模糊,比如
ABS(CumulativeBalance-currentpayed)
(正如我所命名的那样)。你会从一个高余额和低付款的租户那里得到相同的数字,而一个低余额的租户由于某种原因支付了非常高的付款。但您的系统可能有其他检查来防止这种情况。
SELECT OwnerName, SUM(AmountPaid) AS Paid, SUM(AmountOwedComplete) AS Owed, SUM(AmountOwedThisMonth) AS OwedMonth,
SUM(PaidForPast) AS PaidPast, SUM(PaidForPresent) AS PaidPresent, SUM((AmountPaid - PaidForPast - PaidForPresent)) AS PaidFuture, [Description] FROM (
SELECT OwnerName, AmountPaid, AmountOwedComplete, AmountOwedThisMonth, PaidForPast, [Description],
(SELECT CASE WHEN (AmountPaid - PaidForPast) < ABS(AmountOwedThisMonth) THEN AmountPaid - PaidForPast
ELSE ABS(AmountOwedThisMonth) END) AS PaidForPresent
FROM (
SELECT OwnerName, AmountPaid, AmountOwedTotal - AmountPaid AS AmountOwedComplete,
AmountOwedThisMonth,
(SELECT CASE WHEN (AmountPaid < ABS((AmountOwedTotal - AmountPaid)) + AmountOwedThisMonth)
THEN AmountPaid ELSE ABS((AmountOwedTotal - AmountPaid)) + AmountOwedThisMonth END) AS PaidForPast,
Description, TransactionDate
FROM (
SELECT DISTINCT t.TenantName, p.PropertyName, ISNULL(p.OwnerName, 'Uknown') AS OwnerName, (
SELECT SUM(Amount) FROM tblTransaction WHERE
Amount > 0 AND TransactionDate >= @StartDate AND TransactionDate <= @EndDate
AND TenantID = t.ID AND TransactionCode = trans.TransactionCode
) AS AmountPaid, (
SELECT SUM(Amount) FROM tblTransaction WHERE
tblTransaction.TransactionCode = trans.TransactionCode AND tblTransaction.TenantID = t.ID
) AS AmountOwedTotal, (
SELECT SUM(Amount) FROM tblTransaction WHERE tblTransaction.TransactionCode = trans.TransactionCode AND tblTransaction.TenantID = t.ID
AND Amount < 0 AND TransactionDate >= @StartDate AND TransactionDate <= @EndDate
) AS AmountOwedThisMonth, code.Description, trans.TransactionDate FROM tblTransaction trans
LEFT JOIN tblTenantTransCode code ON code.ID = trans.TransactionCode
LEFT JOIN tblTenant t ON t.ID = trans.TenantID
LEFT JOIN tblProperty p ON t.PropertyID = p.ID
WHERE trans.TransactionDate >= @StartDate AND trans.TransactionDate <= @EndDate AND trans.Amount > 0
) q
) q2
)q3
GROUP BY OwnerName, Description
SELECT OwnerName,
SUM(AmountPaid) AS Paid,
SUM(AmountOwedComplete) AS Owed,
SUM(AmountOwedThisMonth) AS OwedMonth,
SUM(PaidForPast) AS PaidPast,
SUM(PaidForPresent) AS PaidPresent,
SUM((AmountPaid - PaidForPast - PaidForPresent)) AS PaidFuture,
[Description]
FROM (SELECT OwnerName,
AmountPaid,
AmountOwedComplete,
AmountOwedThisMonth,
PaidForPast,
[Description],
(SELECT CASE WHEN (AmountPaid - PaidForPast) < ABS(AmountOwedThisMonth)
THEN AmountPaid - PaidForPast
ELSE ABS(AmountOwedThisMonth) END) AS PaidForPresent
FROM (SELECT OwnerName,
AmountPaid,
AmountOwedTotal - AmountPaid AS AmountOwedComplete,
AmountOwedThisMonth,
(SELECT CASE WHEN (AmountPaid < ABS((AmountOwedTotal - AmountPaid)) + AmountOwedThisMonth)
THEN AmountPaid
ELSE ABS((AmountOwedTotal - AmountPaid)) + AmountOwedThisMonth END) AS PaidForPast,
Description,
TransactionDate
FROM (SELECT DISTINCT
t.TenantName,
p.PropertyName,
ISNULL(p.OwnerName, 'Uknown') AS OwnerName,
(SELECT SUM(Amount)
FROM tblTransaction
WHERE Amount > 0
AND TransactionDate >= @StartDate
AND TransactionDate <= @EndDate
AND TenantID = t.ID
AND TransactionCode = trans.TransactionCode) AS AmountPaid,
(SELECT SUM(Amount)
FROM tblTransaction
WHERE tblTransaction.TransactionCode = trans.TransactionCode
AND tblTransaction.TenantID = t.ID) AS AmountOwedTotal,
(SELECT SUM(Amount)
FROM tblTransaction
WHERE tblTransaction.TransactionCode = trans.TransactionCode
AND tblTransaction.TenantID = t.ID
AND Amount < 0
AND TransactionDate >= @StartDate
AND TransactionDate <= @EndDate) AS AmountOwedThisMonth,
code.Description,
trans.TransactionDate
FROM tblTransaction trans
LEFT JOIN tblTenantTransCode code ON code.ID = trans.TransactionCode
LEFT JOIN tblTenant t ON t.ID = trans.TenantID
LEFT JOIN tblProperty p ON t.PropertyID = p.ID
WHERE trans.TransactionDate >= @StartDate
AND trans.TransactionDate <= @EndDate
AND trans.Amount > 0) q
) q2
) q3
GROUP BY OwnerName, Description;
;WITH Transactions_CTE AS
(
SELECT
TenantID,
TransactionCode,
Amount,
CASE
WHEN Amount > 0 AND TransactionDate BETWEEN @BeginDate AND @EndDate
THEN Amount
ELSE 0
END AS AmountPaid,
CASE
WHEN Amount < 0 AND TransactionDate BETWEEN @BeginDate AND @EndDate
THEN Amount
ELSE 0
END AS AmountOwed,
FROM tblTransaction
),
Summary_CTE AS
(
SELECT
t.PropertyID,
tr.TransactionCode,
SUM(tr.Amount) AS CumulativeBalance,
SUM(tr.AmountPaid) AS CurrentPaid,
SUM(tr.AmountOwed) AS CurrentOwed
FROM Transactions_CTE tr
INNER JOIN tblTenant t ON tr.TenantID = t.ID
GROUP BY t.PropertyID, tr.TransactionCode
),
Past_CTE AS
(
SELECT
PropertyID, TransactionCode,
CumulativeBalance, CurrentPaid, CurrentOwed,
CASE
WHEN CurrentPaid <
ABS(CumulativeBalance - CurrentPaid) + CurrentOwed
THEN CurrentPaid
ELSE ABS(CumulativeBalance - CurrentPaid) + CurrentOwed
END AS PaidForPast
FROM Summary_CTE
),
Present_CTE AS
(
SELECT
PropertyID, TransactionCode,
CumulativeBalance, CurrentPaid, CurrentOwed,
PaidForPast,
CASE
WHEN (CurrentPaid - PaidForPast) < ABS(CurrentOwed)
THEN CurrentPaid - PaidForPast
ELSE ABS(CurrentOwed)
END AS PaidForPresent
FROM Past_CTE
)
SELECT
ISNULL(p.OwnerName, 'UNKNOWN') AS OwnerName,
c.[Description],
CumulativeBalance, CurrentPaid, CurrentOwed,
CumulativeBalance - CurrentPaid AS CumulativeOwed,
PaidForPast, PaidForPresent,
CurrentPaid - PaidForPast - PaidForPresent AS PaidForFuture,
[Description]
FROM Present_CTE s
LEFT JOIN tblProperty p ON p.ID = s.PropertyID
LEFT JOIN tblTenantTransCode c ON c.ID = s.TransactionCode