我目前正在使用一个悖论数据库,该数据库是在我开始在一家保险公司工作之前实施的。
长话短说,当我试图编译所有活跃客户的借方/贷方余额的查询时,如果我为每个客户进行查询,它会给每个客户不同的余额。对于 100K 的客户群和超过 200 万笔交易,这样做是不可行的。所以这是我为个人客户所做的:
代码:
SELECT COUNT(Debit) as NumberOfDebits
, COUNT(Credit) as NumberOfCredit
, SUM(Debit) as DebitTotal
, SUM(Credit) as CreditTotal
FROM MemberTransactions
WHERE MemberID = '####000094';
正如我上面提到的,这为会员提供了正确的余额,但如果我执行以下操作:
SELECT MemberID
, COUNT(Debit) as NumberOfDebits
, COUNT(Credit) as NumberOfCredit
, SUM(Debit) as DebitTotal
, SUM(Credit) as CreditTotal
FROM MemberTransactions
GROUP BY MemberID;
对于表中的大多数成员,它为我提供了不同的计数和总和结果。
这是表格结构,因此您可以了解我必须使用什么以及我想要完成什么。每行都是一个交易,借记或贷记到会员的帐户。所以我想做的是将每个成员的每个借方和贷方分别汇总到一个单元格中。所以这就是为什么我是 group by,认为它会为每个成员添加每个贷方和借方,但它不会那样做。那我该怎么做。我试图从成员详细信息中对 membernr 进行外部联接,但我仍然需要分组,最终得到相同的结果
表结构:
PeriodNr I
EffectiveDate D
Entrynr +
MemberNr A
Date D
JournalNr A
ReferenceNr A
DtAmount N
CtAmount N
Narration A
ModifyUserId A
ModifStamp @
我确实注意到的一件事是,在我运行以下查询之后:
SELECT COUNT(A.CtAmount) as CreditCount
, Sum(A.CtAmount) as Credit
, COUNT(A.DtAmount) as DebitCount
, SUM(DtAmount) as Debit
, M.MemberNr
, M.Premium
FROM MemAcc as A
LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr
GROUP BY M.MemberNr, M.Premium;
顶部有一行没有 MemberNr,并且计数、借方和贷方的数量非常多。比任何帐户都应该高得多,所以我猜测由于某种原因丢失的交易会进入这一行。
例如,如果我唯一查询假设成员 X,我得到借方和贷方 3094,借方计数为 55,贷方计数为 18,这与该成员表中的记录数相匹配,但是当我运行上面的查询,我得到的贷方计数为 2,借方计数为 19,贷方为 1590,借方为 2090。
所以我很难过。我不知道这是否是一个悖论问题,或者更确切地说是我对 SQL 的无能理解。
哦,是的,空白成员的贷方数为 273,借方数为 341,贷方数为 19030,借方数为 17168。