Paradox数据库中的SUM()问题

时间:2010-01-25 10:56:22

标签: sql group-by sum paradox

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

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

它为我提供了表中大多数成员的不同计数和总和结果。

这是表结构,因此您可以了解我必须使用的内容以及我想要完成的内容。每一行都是一笔交易,其中包含会员帐户的借方或贷方。因此,我想要做的是将每个借方和贷方分别汇总到每个成员的每个单元格中。所以这就是为什么我是小组,认为它会为每个成员加起来每个信用和借记,但它不会那样做。那我该怎么做呢。我已经尝试从成员详细信息中对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。

所以我很难过。我不知道这是一个Paradox问题,还是我对SQL的无能理解。

哦,是的空白会员的信用点数为273,借方数为341,信用额度为19030,借方为17168。

3 个答案:

答案 0 :(得分:0)

  

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

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

诊断这些问题很难。你有一个线索就是:

  

它给了我不同的数量和   总计大多数成员的结果   桌子。 (强调我的)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在MemAcc表中,memberNr可能不是NULL,只是左外连接它不在Member表上,但是你正在通过成员表列进行组 - 因此它显示为NULL,因为MemAcc条目没有成员表中存在更长的时间。

e.g。如果你这样做:

 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值。

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

在更糟糕的情况下,已经看到需要联合使用其中一些查询。 E.g。

 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;