Полный нуб здесь, так что медведь со мной! ...Исключить повторяющиеся значения в 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!
Я уверен, что это, вероятно, что-то очень простое для всех вас! Благодаря!
Привет, SQL было бы полезно понять, как используются эти записи ошибок. благодаря ! – Telkarion
Спасибо - SQL, добавленный выше – DickieD
, вам нужно использовать [встроенный просмотр] (http://www.orafaq.com/wiki/Inline_view) или [with clause] (http: //www.dba-oracle. com/t_sql99_with_clause.htm) –