1

我目前正在使用一个悖论数据库,该数据库是在我开始在一家保险公司工作之前实施的。

长话短说,当我试图编译所有活跃客户的借方/贷方余额的查询时,如果我为每个客户进行查询,它会给每个客户不同的余额。对于 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。

4

3 回答 3

0

MemAcc 表中的 memberNr 可能不是 NULL,只是使用左外连接它不在 Member 表上,但您正在按成员表列进行分组 - 因此它显示为 NULL,因为 MemAcc 条目不再存在成员表。

例如,如果你这样做:

 SELECT COUNT(A.CtAmount) as CreditCount 
       , Sum(A.CtAmount) as Credit 
       , COUNT(A.DtAmount) as DebitCount  
       , SUM(DtAmount) as Debit 
       , A.MemberNr 
       , M.Premium   
 FROM MemAcc as A   
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr   
 GROUP BY A.MemberNr, M.Premium; 

您将看到不同的结果 - 至少 MemberNr 的值不再存在于 Member 中。

至于你奇怪的结果。我似乎记得 Paradox 表中的行数有一个限制,您可能正在接近这个限制。当然可能不是 - 并且取决于您使用的 Paradox 版本,以及您访问数据的方式。

在更糟糕的情况下,已经看到需要将其中一些查询合并在一起。例如

 SELECT COUNT(A.CtAmount) as CreditCount 
       , Sum(A.CtAmount) as Credit 
       , COUNT(A.DtAmount) as DebitCount  
       , SUM(DtAmount) as Debit 
       , A.MemberNr 
       , M.Premium   
 FROM MemAcc as A   
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr   
 WHERE A.MemberNr <= 100000
 GROUP BY A.MemberNr, M.Premium; 

 UNION

 SELECT COUNT(A.CtAmount) as CreditCount 
       , Sum(A.CtAmount) as Credit 
       , COUNT(A.DtAmount) as DebitCount  
       , SUM(DtAmount) as Debit 
       , A.MemberNr 
       , M.Premium   
 FROM MemAcc as A   
 LEFT OUTER JOIN Member as M on A.MemberNr = M.MemberNr   
 WHERE A.MemberNr > 100000
 GROUP BY A.MemberNr, M.Premium; 
于 2010-02-02T13:44:16.217 回答
0

我不知道这是否是一个悖论问题,或者更确切地说是我对 SQL 的无能理解。

我希望“单个成员”查询的结果集和“所有成员”查询中的等效行将返回相同的计数和总和。如果这也是您的期望,那么我不会将您对 SQL 的理解描述为“无能”。

诊断这类问题很困难。你有一个线索是这样的:

对于表中的大多数成员,它为我提供了不同的计数和总和结果。(强调我的)

您需要做的是选择两个查询返回相同结果的几个成员,并找出它们与具有不同结果的成员的区别。

于 2010-01-25T11:34:05.333 回答
0

您从第三个查询中看到的结果表明您在 MemAcc 表中有一堆记录,其中 MemberNr 为空。由于无法将它们附加到正确的成员,因此它们将全部组合在一起,并且成员似乎具有较少的 MemAcc 记录。

于 2010-01-25T12:13:26.853 回答