Проблема SUM () в базе данных Paradox - PullRequest
1 голос
/ 25 января 2010

В настоящее время я работаю с базой данных парадоксов, которая была внедрена до того, как я начал работать на своей нынешней работе в страховой фирме.

Короче говоря, когда я пытаюсь скомпилировать запрос дебетовых / кредитных балансов всех активных клиентов, для каждого клиента у меня разный баланс, если я делаю запрос для каждого отдельного клиента. С клиентской базой в 100 КБ и количеством транзакций более 2 миллионов это сделать невозможно. Вот что я делаю для индивидуального клиента:

Код:

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.

Так что я в тупике. Я не знаю, является ли это проблемой Парадокса, или, скорее, моим неумелым пониманием SQL.

О да, у пустого участника счет кредита 273, счет дебета 341, кредит 19030 и дебет 17168.

Ответы [ 3 ]

0 голосов
/ 25 января 2010

Результаты третьего запроса показывают, что в таблице MemAcc имеется несколько записей, где MemberNr равен нулю. Поскольку нет никакого способа прикрепить их к нужному члену, все они будут сгруппированы вместе, и у членов будет меньше записей MemAcc.

0 голосов
/ 02 февраля 2010

memberNr может не быть NULL в таблице MemAcc, просто при левом внешнем объединении его нет в таблице 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; 
0 голосов
/ 25 января 2010

Я не знаю, парадокс ли это проблема, а точнее мой неумелый понимание SQL.

Я ожидал бы, что набор результатов для запроса "один элемент" и эквивалентная строка в запросе "все члены" будут возвращать одинаковые значения и суммы. Если бы вы тоже этого ожидали, я бы не назвал ваше понимание SQL «неумелым».

Диагностировать такого рода проблемы сложно. Единственный ключ, который у вас есть, это:

Это дает мне и другое количество и сумма результатов для большинства участников в стол. (выделение мое)

Что вам нужно сделать, это выбрать пару участников, в которых оба запроса возвращают один и тот же результат, и выяснить, что отличает их от участников, которые имеют разные результаты.

...