2014-03-08 3 views
0

Полный нуб здесь, так что медведь со мной! ...Исключить повторяющиеся значения в SUM с PeopleSoft Query

Я пытаюсь написать запрос в Oracle PeopleSoft что рассчитывает и суммирующий колонку количество Таблица. Значение COUNT работает нормально; но поскольку одна из таблиц, соединенных в запросе, может иметь несколько значений для каждой строки таблицы, к которой она присоединена, SUM включает несколько экземпляров и дает завышенные значения. Вот основные:

Таблица A: HEADER

ТАБЛИЦА B: ЛИНИЯ

ТАБЛИЦА C: ERROR_CODE (внешнее соединение к ТАБЛИЦЕ B)

Я пытаюсь суммируйте B.LINE_AMOUNT для каждого уникального A.HEADER_ENTRY; но поскольку каждая строка ваучера может иметь более одного C.ERROR_CODE, запрос умножает B.LINE_AMOUNT на каждое правило.

Пример - HEADER_ENTRY #12345 имеет 4 линии на общую сумму $50 каждая, а строка 3 имеет 2 коды ошибок. Когда я запускаю запрос, результатом для этой записи является $250 вместо $200.

Быстрые заметки:

  • Фактический запрос имеет 7 записей таблицы, и есть на самом деле два различные «код ошибки» запись (оба из которых необходимо) - оба находятся на наружном Соединения

  • SUM является условным; так что я в настоящее время использую CASE WHEN заявление с ним ->

    SUM(CASE WHEN A.ENTRY_DATE < :2 THEN B.LINE_AMOUNT ELSE 0 END)

EDIT: В соответствии с просьбой, вот SQL, как берется из запроса PeopleSoft:

SELECT A.BUSINESS_UNIT, CASE WHEN (':6' = 'Y') AND (A.MATCH_STATUS_VCHR = 'M') THEN 
C.MATCH_RULE_ID 
WHEN (':6' = 'Y') AND (A.VOUCHER_ID = F.VOUCHER_ID) THEN 
F.MATCH_RULE_ID 
ELSE NULL END, A.ORIGIN, A.CLOSE_STATUS, A.MATCH_STATUS_VCHR, COUNT(DISTINCT A.VOUCHER_ID), SUM(CASE WHEN (TO_CHAR(E.JOURNAL_DATE,'YYYY-MM-DD') < ':2') THEN E.MONETARY_AMOUNT ELSE 0 END), TO_CHAR(SYSDATE,'YYYY-MM-DD') 
    FROM PS_VOUCHER A, (PS_VOUCHER_LINE B LEFT OUTER JOIN PS_MTCH_RULE_OVRD C ON B.BUSINESS_UNIT = C.BUSINESS_UNIT AND B.VOUCHER_ID = C.VOUCHER_ID AND B.VOUCHER_LINE_NUM = C.VOUCHER_LINE_NUM), ((PS_DISTRIB_LINE D LEFT OUTER JOIN PS_VCHR_ACCTG_LINE E ON D.BUSINESS_UNIT = E.BUSINESS_UNIT AND D.VOUCHER_ID = E.VOUCHER_ID AND D.VOUCHER_LINE_NUM = E.VOUCHER_LINE_NUM AND D.DISTRIB_LINE_NUM = E.DISTRIB_LINE_NUM AND E.LEDGER = D.LEDGER AND E.SHIPTO_ID > ' ') LEFT OUTER JOIN PS_AP_MTCH_EXCPTN F ON E.BUSINESS_UNIT = F.BUSINESS_UNIT AND E.VOUCHER_ID = F.VOUCHER_ID AND E.VOUCHER_LINE_NUM = F.VOUCHER_LINE_NUM), PS_VENDOR G 
    WHERE A.DELETE_DT IS NULL 
    AND (A.ENTERED_DT BETWEEN CASE WHEN (TO_CHAR(TO_DATE(TO_DATE(:1,'YYYY-MM-DD')),'D') = 1) THEN 
TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-2 
WHEN (TO_CHAR(TO_DATE(TO_DATE(:1,'YYYY-MM-DD')),'D') = 2) THEN TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-3 
ELSE TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-1 END AND CASE WHEN (TO_CHAR(TO_DATE(TO_DATE(:2,'YYYY-MM-DD')),'D') = 1) THEN 
TO_DATE(TO_DATE(:2,'YYYY-MM-DD'))-2 
WHEN (TO_CHAR(TO_DATE(TO_DATE(:2,'YYYY-MM-DD')),'D') = 2) THEN TO_DATE(TO_DATE(:2,'YYYY-MM-DD'))-3 
ELSE TO_DATE(TO_DATE(:2,'YYYY-MM-DD'))-1 END 
    OR (A.MATCHED_DT >= CASE WHEN (:9 = 'Y') THEN 
NULL 
WHEN (A.CLOSE_STATUS = 'C') THEN 
TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-1 
ELSE TO_DATE(TO_DATE(:1,'YYYY-MM-DD')) END 
    AND A.ENTERED_DT <= CASE WHEN (TO_CHAR(TO_DATE(TO_DATE(:1,'YYYY-MM-DD')),'D') = 1) THEN 
TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-2 
WHEN (TO_CHAR(TO_DATE(TO_DATE(:1,'YYYY-MM-DD')),'D') = 2) THEN TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-3 
ELSE TO_DATE(TO_DATE(:1,'YYYY-MM-DD'))-1 END)) 
    AND A.MATCH_ACTION = 'Y' 
    AND (A.MATCHED_DT > E.JOURNAL_DATE 
    OR (A.GROSS_AMT = 0 
    AND A.MATCHED_DT > A.ENTERED_DT) 
    OR (A.ACCOUNTING_DT > A.ENTERED_DT 
    AND A.MATCHED_DT > A.MATCH_DUE_DT) 
    OR B.RECEIPT_DT > A.ENTERED_DT 
    OR (C.VOUCHER_ID IS NOT NULL 
    AND A.MATCH_STATUS_VCHR IN ('C','M','O')) 
    OR F.VOUCHER_ID IS NOT NULL 
    OR A.MATCH_STATUS_VCHR NOT IN ('T','M','N')) 
    AND (A.MATCH_STATUS_VCHR = CASE WHEN (:3 = 'N') AND (:4 = 'N') AND (:5 = 'N') THEN 
A.MATCH_STATUS_VCHR 
WHEN (:3 = 'Y') THEN 
'M' 
ELSE NULL END 
    OR C.MATCH_RULE_ID = CASE WHEN (:4 = 'Y') THEN 
C.MATCH_RULE_ID 
ELSE NULL END 
    OR F.MATCH_RULE_ID = CASE WHEN (:4 = 'Y') THEN 
F.MATCH_RULE_ID 
ELSE NULL END) 
    AND A.VENDOR_ID = CASE WHEN (:7 = ' ') THEN 
A.VENDOR_ID 
ELSE :7 END 
    AND (CASE WHEN (:6 = 'Y') AND (A.MATCH_STATUS_VCHR = 'M') THEN 
C.MATCH_RULE_ID 
WHEN (:6 = 'Y') AND (A.VOUCHER_ID = F.VOUCHER_ID) THEN 
F.MATCH_RULE_ID 
ELSE NULL END = :8 
    OR A.VOUCHER_ID = CASE WHEN (:8 = ' ') THEN 
A.VOUCHER_ID 
ELSE NULL END) 
    AND A.BUSINESS_UNIT = B.BUSINESS_UNIT 
    AND A.VOUCHER_ID = B.VOUCHER_ID 
    AND B.BUSINESS_UNIT = D.BUSINESS_UNIT 
    AND B.VOUCHER_ID = D.VOUCHER_ID 
    AND B.VOUCHER_LINE_NUM = D.VOUCHER_LINE_NUM 
    AND G.VENDOR_ID = A.VENDOR_ID 
    GROUP BY A.BUSINESS_UNIT, CASE WHEN (':6' = 'Y') AND (A.MATCH_STATUS_VCHR = 'M') THEN 
C.MATCH_RULE_ID 
WHEN (':6' = 'Y') AND (A.VOUCHER_ID = F.VOUCHER_ID) THEN 
F.MATCH_RULE_ID 
ELSE NULL END, A.ORIGIN, A.CLOSE_STATUS, A.MATCH_STATUS_VCHR 
    ORDER BY 1, 5, 2 

Когда бежать, я получить идеальный счет; но сумма заканчивается завышенной, потому что таблицы «MTCH_RULE_OVRD» и «AP_MTCH_EXCPTN» могут иметь несколько «MATCH_RULE_ID» для каждого. Не уверен, нужен ли мне подсказка или что ... но я STUCK-Overflow!

Я уверен, что это, вероятно, что-то очень простое для всех вас! Благодаря!

+0

Привет, SQL было бы полезно понять, как используются эти записи ошибок. благодаря ! – Telkarion

+0

Спасибо - SQL, добавленный выше – DickieD

+0

, вам нужно использовать [встроенный просмотр] (http://www.orafaq.com/wiki/Inline_view) или [with clause] (http: //www.dba-oracle. com/t_sql99_with_clause.htm) –

ответ

0

В случае, если кто хотел бы знать, я (к сожалению) в конечном итоге приходится прибегать к подзапрос подход (я говорю «к сожалению», потому что PeopleSoft 9.1, к сожалению, есть некоторые проблемы с запросами с несколькими профсоюзными/подзапрос комбинации, которые приводят к завершению работы системы сеанса проблемы, поэтому я пытался избежать этого подхода). Все еще определенно заинтересовано, если кто-то еще знает о других способах достижения этого; спасибо

 Смежные вопросы

  • Нет связанных вопросов^_^