Определение общих строк на основе значения столбца и добавления условий для группировки в SQL - PullRequest
0 голосов
/ 27 августа 2018

Я застрял с проблемой SQL. Не могли бы вы помочь мне со следующим: В настоящее время у меня есть SQL, который извлекает данные на основе различных таблиц и объединенных значений. Я должен ограничить выбор данных, проверив, совпадают ли части составных значений, и выполнить расчет, чтобы определить, должна ли эта группа записей отображаться или нет.

Пример данных:

ID  Acct ID    Credit  Debit  Balance
1   10.1.2.3      -10      0       10
2   10.5.2.4        0     10       10
3   22.6.1.1        0    -15      -15
4   11.3.5.5       -5      0       -5
5   12.3.5.6       -2      0       -2
6   15.1.1.1       30      0       30
7   20.16.5.1       0      7        7

Часть сцепленного, чтобы принять во внимание является третьим значением. (Используемый разделитель: ".")

  1. Для идентификаторов 1 и 2 третье значение объединенного поля - «2», что соответствует первому критерию.

Затем для двух строк записей сумма кредита и дебета суммируется до нуля, что соответствует второму критерию. Следовательно, ID 1 и 2 не должны отображаться.

  1. То же самое для идентификаторов 4, 5 и 7, третье объединенное значение одинаково, то есть "5", сумма кредита и дебета суммируется до нуля. Они не должны быть выбраны в запросе SQL.

  2. ID 3 и 6 имеют одно и то же третье каскадное значение, но сумма не равна нулю, поэтому эти две строки должны отображаться.

Не могли бы вы помочь мне с вышесказанным? Обратите внимание, что я уже знаю, как получить только 3-е значение объединенного поля.

Заранее большое спасибо.

Ответ: Здравствуйте, большое спасибо, похоже, он работает для предоставленного вами фрагмента кода, однако я все еще не могу заставить его работать с моим SQL.

Текущий SQL:

SELECT Hca.ACCOUNT_NAME "Customer Name"
    ,hca.ACCOUNT_NUMBER "Account Number"
    ,AR_TRX_H.TRX_NUMBER "Invoice Number/Credit Memo"
    ,TO_CHAR(AR_TRX_GL.GL_DATE, 'DD/MM/YYYY') "Accounting Date"
    ,GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 AS "Concatenated Segments"
    ,XLA_L.ACCOUNTED_DR
    ,XLA_L.ACCOUNTED_CR
    ,
    --XLA_L.ACCOUNTED_CR-XLA_L.ACCOUNTED_DR "Balances"
    decode(XLA_L.ACCOUNTED_CR, NULL, 0, XLA_L.ACCOUNTED_CR) - decode(XLA_L.ACCOUNTED_DR, NULL, 0, XLA_L.ACCOUNTED_DR) "Balances"
    ,
FROM hz_cust_accounts hca
    ,RA_CUSTOMER_TRX_ALL AR_TRX_H
    ,RA_CUST_TRX_LINE_GL_DIST_ALL AR_TRX_GL
    ,GL_CODE_COMBINATIONS GLCC
    ,XLA_AE_HEADERS XLA_H
    ,XLA_AE_LINES XLA_L
WHERE 1 = 1
    AND HCA.CUST_ACCOUNT_ID = AR_TRX_H.BILL_TO_CUSTOMER_ID
    AND AR_TRX_H.CUSTOMER_TRX_ID = AR_TRX_GL.CUSTOMER_TRX_ID
    AND AR_TRX_GL.ACCOUNT_CLASS = 'REV'
    AND AR_TRX_GL.CODE_COMBINATION_ID = GLCC.CODE_COMBINATION_ID
    AND AR_TRX_GL.EVENT_ID = XLA_H.EVENT_ID
    AND AR_TRX_GL.SET_OF_BOOKS_ID = XLA_H.LEDGER_ID
    AND XLA_H.AE_HEADER_ID = XLA_L.AE_HEADER_ID
    AND XLA_L.CODE_COMBINATION_ID = AR_TRX_GL.CODE_COMBINATION_ID
    AND GLCC.SEGMENT2 LIKE '419%'
    AND GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 IN (
        SELECT GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 AS "Concatenated"
        FROM hz_cust_accounts hca1
            ,RA_CUSTOMER_TRX_ALL AR_TRX_H
            ,RA_CUST_TRX_LINE_GL_DIST_ALL AR_TRX_GL
            ,GL_CODE_COMBINATIONS GLCC
            ,XLA_AE_HEADERS XLA_H
            ,XLA_AE_LINES XLA_L
        WHERE 1 = 1
            AND HCA1.CUST_ACCOUNT_ID = AR_TRX_H.BILL_TO_CUSTOMER_ID
            AND AR_TRX_H.CUSTOMER_TRX_ID = AR_TRX_GL.CUSTOMER_TRX_ID
            AND AR_TRX_GL.ACCOUNT_CLASS = 'REV'
            AND AR_TRX_GL.CODE_COMBINATION_ID = GLCC.CODE_COMBINATION_ID
            AND AR_TRX_GL.EVENT_ID = XLA_H.EVENT_ID
            AND AR_TRX_GL.SET_OF_BOOKS_ID = XLA_H.LEDGER_ID
            AND XLA_H.AE_HEADER_ID = XLA_L.AE_HEADER_ID
            AND XLA_L.CODE_COMBINATION_ID = AR_TRX_GL.CODE_COMBINATION_ID
            AND GLCC.SEGMENT2 LIKE '419%'
        GROUP BY GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9
        )

Обратите внимание, что это Сегмент6, который является значением, используемым из объединенных значений.

После попытки добавить предоставленную вами логику:

WITH base_data
AS (
    SELECT Hca.ACCOUNT_NAME "Customer Name"
        ,hca.ACCOUNT_NUMBER "Account Number"
        ,AR_TRX_H.TRX_NUMBER "Invoice Number/Credit Memo"
        ,TO_CHAR(AR_TRX_GL.GL_DATE, 'DD/MM/YYYY') "Accounting Date"
        ,GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 AS "Concatenated Segments"
        ,XLA_L.ACCOUNTED_DR AS CREDIT
        ,XLA_L.ACCOUNTED_CR AS DEBIT
        ,decode(XLA_L.ACCOUNTED_CR, NULL, 0, XLA_L.ACCOUNTED_CR) - decode(XLA_L.ACCOUNTED_DR, NULL, 0, XLA_L.ACCOUNTED_DR) "Balances"
        ,
        --Segment 6 is the value to group in order to check the amount
        GLCC.SEGMENT6 AS segment6
    FROM hz_cust_accounts hca
        ,RA_CUSTOMER_TRX_ALL AR_TRX_H
        ,RA_CUST_TRX_LINE_GL_DIST_ALL AR_TRX_GL
        ,GL_CODE_COMBINATIONS GLCC
        ,XLA_AE_HEADERS XLA_H
        ,XLA_AE_LINES XLA_L DUAL

    UNION ALL
    )
SELECT *
FROM (
    SELECT A.*
        ,sum(A.DEBIT + A.CREDIT) OVER (PARTITION BY A.segment6) AS extr_ID_balance
    FROM base_data A
    )
WHERE extr_ID_balance <> 0
    AND HCA.CUST_ACCOUNT_ID = AR_TRX_H.BILL_TO_CUSTOMER_ID
    AND AR_TRX_H.CUSTOMER_TRX_ID = AR_TRX_GL.CUSTOMER_TRX_ID
    AND AR_TRX_GL.ACCOUNT_CLASS = 'REV'
    AND AR_TRX_GL.CODE_COMBINATION_ID = GLCC.CODE_COMBINATION_ID
    AND AR_TRX_GL.EVENT_ID = XLA_H.EVENT_ID
    AND AR_TRX_GL.SET_OF_BOOKS_ID = XLA_H.LEDGER_ID
    AND XLA_H.AE_HEADER_ID = XLA_L.AE_HEADER_ID
    AND XLA_L.CODE_COMBINATION_ID = AR_TRX_GL.CODE_COMBINATION_ID
    AND GLCC.SEGMENT2 LIKE '419%'
    AND GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 IN (
        SELECT GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 AS "Concatenated"
        FROM hz_cust_accounts hca1
            ,RA_CUSTOMER_TRX_ALL AR_TRX_H
            ,RA_CUST_TRX_LINE_GL_DIST_ALL AR_TRX_GL
            ,GL_CODE_COMBINATIONS GLCC
            ,XLA_AE_HEADERS XLA_H
            ,XLA_AE_LINES XLA_L
        WHERE 1 = 1
            AND HCA1.CUST_ACCOUNT_ID = AR_TRX_H.BILL_TO_CUSTOMER_ID
            AND AR_TRX_H.CUSTOMER_TRX_ID = AR_TRX_GL.CUSTOMER_TRX_ID
            AND AR_TRX_GL.ACCOUNT_CLASS = 'REV'
            AND AR_TRX_GL.CODE_COMBINATION_ID = GLCC.CODE_COMBINATION_ID
            AND AR_TRX_GL.EVENT_ID = XLA_H.EVENT_ID
            AND AR_TRX_GL.SET_OF_BOOKS_ID = XLA_H.LEDGER_ID
            AND XLA_H.AE_HEADER_ID = XLA_L.AE_HEADER_ID
            AND XLA_L.CODE_COMBINATION_ID = AR_TRX_GL.CODE_COMBINATION_ID
            AND GLCC.SEGMENT2 LIKE '419%'
        GROUP BY GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9
        )

Благодарен, если вы можете помочь с вышеупомянутым.

Спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Это место, где вы можете использовать аналитику - см. «Over (partition by)» ниже. Поскольку вы сказали, что знаете, как извлечь идентификатор из строки, это не показано.

WITH base_data as
(
SELECT 1 AS ID,  '10.1.2.3' AS acct_ID, 2 as extr_ID, -10 AS CREDIT, 0 AS DEBIT, 10 AS balance FROM DUAL UNION ALL
SELECT 2,        '10.5.2.4',            2,              0,          10,          10 FROM DUAL UNION ALL
SELECT 3,        '22.6.1.1',            1,              0,         -15,         -15 FROM DUAL UNION ALL
SELECT 4,        '11.3.5.5',            5,             -5,           0,          -5 FROM DUAL UNION ALL
SELECT 5,        '12.3.5.6',            5,             -2,           0,          -2 FROM DUAL UNION ALL
SELECT 6,        '15.1.1.1',            1,             30,           0,          30 FROM DUAL UNION ALL
SELECT 7,        '20.16.5.1',           5,              0,           7,           7 FROM DUAL)


select * 
from 
  (
  select A.*,
     sum(A.DEBIT + A.CREDIT) over (partition by extr_id) as extr_ID_balance
  from base_data A)

where extr_ID_balance <> 0

order by 1

Результаты:

ID  ACCT_ID EXTR_ID CREDIT  DEBIT   BALANCE EXTR_ID_BALANCE
3   22.6.1.1    1   0       -15     -15     15
6   15.1.1.1    1   30       0       30     15

Обновление для ответа на запрос, представленный позже.

1 - ваш "текущий запрос" неверен - в списке выбора есть запятая. Угадаю, что это опечатка.

2 - У меня нет вашей базы данных - "with base_data" в примере запроса просто создает таблицу из предоставленных образцов данных.

В любом случае, вы, вероятно, хотите что-то вроде этого:

WITH base_qry
AS (
    SELECT Hca.ACCOUNT_NAME "Customer Name"
        ,hca.ACCOUNT_NUMBER "Account Number"
        ,AR_TRX_H.TRX_NUMBER "Invoice Number/Credit Memo"
        ,TO_CHAR(AR_TRX_GL.GL_DATE, 'DD/MM/YYYY') "Accounting Date"
        ,GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 AS "Concatenated Segments"
        ,XLA_L.ACCOUNTED_DR
        ,XLA_L.ACCOUNTED_CR
        ,
        --XLA_L.ACCOUNTED_CR-XLA_L.ACCOUNTED_DR "Balances"
        decode(XLA_L.ACCOUNTED_CR, NULL, 0, XLA_L.ACCOUNTED_CR) - decode(XLA_L.ACCOUNTED_DR, NULL, 0, XLA_L.ACCOUNTED_DR) "Balances"
        --sum debits and credits over segment_6 here
        ,sum(XLA_L.ACCOUNTED_DR + XLA_L.ACCOUNTED_CR) OVER (PARTITION BY GLCC.SEGMENT6) AS extr_ID_balance
    FROM hz_cust_accounts hca
        ,RA_CUSTOMER_TRX_ALL AR_TRX_H
        ,RA_CUST_TRX_LINE_GL_DIST_ALL AR_TRX_GL
        ,GL_CODE_COMBINATIONS GLCC
        ,XLA_AE_HEADERS XLA_H
        ,XLA_AE_LINES XLA_L
    WHERE 1 = 1
        AND HCA.CUST_ACCOUNT_ID = AR_TRX_H.BILL_TO_CUSTOMER_ID
        AND AR_TRX_H.CUSTOMER_TRX_ID = AR_TRX_GL.CUSTOMER_TRX_ID
        AND AR_TRX_GL.ACCOUNT_CLASS = 'REV'
        AND AR_TRX_GL.CODE_COMBINATION_ID = GLCC.CODE_COMBINATION_ID
        AND AR_TRX_GL.EVENT_ID = XLA_H.EVENT_ID
        AND AR_TRX_GL.SET_OF_BOOKS_ID = XLA_H.LEDGER_ID
        AND XLA_H.AE_HEADER_ID = XLA_L.AE_HEADER_ID
        AND XLA_L.CODE_COMBINATION_ID = AR_TRX_GL.CODE_COMBINATION_ID
        AND GLCC.SEGMENT2 LIKE '419%'
        AND GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 IN (
            SELECT GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9 AS "Concatenated"
            FROM hz_cust_accounts hca1
                ,RA_CUSTOMER_TRX_ALL AR_TRX_H
                ,RA_CUST_TRX_LINE_GL_DIST_ALL AR_TRX_GL
                ,GL_CODE_COMBINATIONS GLCC
                ,XLA_AE_HEADERS XLA_H
                ,XLA_AE_LINES XLA_L
            WHERE 1 = 1
                AND HCA1.CUST_ACCOUNT_ID = AR_TRX_H.BILL_TO_CUSTOMER_ID
                AND AR_TRX_H.CUSTOMER_TRX_ID = AR_TRX_GL.CUSTOMER_TRX_ID
                AND AR_TRX_GL.ACCOUNT_CLASS = 'REV'
                AND AR_TRX_GL.CODE_COMBINATION_ID = GLCC.CODE_COMBINATION_ID
                AND AR_TRX_GL.EVENT_ID = XLA_H.EVENT_ID
                AND AR_TRX_GL.SET_OF_BOOKS_ID = XLA_H.LEDGER_ID
                AND XLA_H.AE_HEADER_ID = XLA_L.AE_HEADER_ID
                AND XLA_L.CODE_COMBINATION_ID = AR_TRX_GL.CODE_COMBINATION_ID
                AND GLCC.SEGMENT2 LIKE '419%'
            GROUP BY GLCC.SEGMENT1 || '.' || GLCC.SEGMENT2 || '.' || GLCC.SEGMENT3 || '.' || GLCC.SEGMENT4 || '.' || GLCC.SEGMENT5 || '.' || GLCC.SEGMENT6 || '.' || GLCC.SEGMENT7 || '.' || GLCC.SEGMENT8 || '.' || GLCC.SEGMENT9
            )
    )
SELECT *
FROM base_qry
--filter to segment 6 where debit+credit sum <> 0
WHERE extr_ID_balance <> 0

Не запускал, так как у меня нет вашей базы данных - вам, вероятно, потребуется отладка, обработка нулевых значений и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...